毛毛的小窝 — 关注技术交流、让我们一起成长

导航

Osql\sqlcmd工具管理 SQL Server

本页
 概要
   何为 Osql?
   如何使用 Osql?
     交互式输入 Transact-SQL 语句
     提交 Osql 作业
   连接到 SQL Server 桌面引擎 (MSDE 2000)
   管理 MSDE 2000
     新建登录帐户
     访问数据库
     如何更改登录密码
     创建数据库
     备份和还原数据库
     附加和分离数据库
 参考
 这篇文章中的信息适用于:

概要
“SQL Server 桌面引擎”(也叫 MSDE 2000)没有自己的用户界面,因为它主要设计为在后台运行。用户通过 MSDE 2000 嵌入的程序与它交互。随 MSDE 2000 提供的唯一工具是 osql 。可执行文件 Sql.exe 在 MSDE 2000 的默认实例的 MSSQL\Binn 文件夹中。本文重点讨论如何通过使用 osql 工具管理 MSDE 2000。


 回到顶端

何为 Osql?
osql 工具是一个 Microsoft Windows 32 命令提示符工具,您可以使用它运行 Transact-SQL 语句和脚本文件。osql 工具使用 ODBC 数据库应用程序编程接口 (API) 与服务器通讯。


 回到顶端

如何使用 Osql?
一般情况下,可以这样使用 osql 工具:
• 用户通过与使用命令提示符时相似的方式交互输入 Transact-SQL 语句。
• 用户提交 osql 作业,方法是: • 指定单个要运行的 Transact-SQL 语句。 - 或 -

 
• 将该工具指向一个包含要运行的 Transact-SQL 语句的脚本文件。
 

交互式输入 Transact-SQL 语句
如要显示 osql 工具的区分大小写的选项列表,请在命令提示符下键入如下内容,然后按 ENTER 键:

osql -?

如想了解关于 osql 工具的每一选项的更多信息,请参见“SQL Server 联机图书”中的“osql Utility”主题。

如要交互输入 Transact-SQL 语句,请按照下列步骤操作:

1. 确认 MSDE 2000 正在运行。
2. 连接到 MSDE 2000(有关更多信息,请参见标题为“连接到 SQL Server 桌面引擎 (MSDE 2000)”的部分)。
3. 在 osql 命令提示符下,键入 Transact-SQL 语句,然后按 ENTER 键。 当您在输入的每一行后按 ENTER 键时,osql 将缓存该命令行上的语句。

• 如要运行当前缓存的语句,请键入“Go”,接着按 ENTER 键。

 
• 如要运行一批 Transact-SQL 语句,请分别在单独的行上输入每一个 Transact-SQL 命令。然后,在最后一行上键入“Go”以表示批处理命令的结束并运行当前缓存的语句。

运行结果出现在控制台窗口。

 
4. 当您在输入的每一行后按 ENTER 键时,如想从 osql 退出,请键入 QUIT 或 EXIT,并按 ENTER 键。


提交 Osql 作业
一般情况下,您可以用两种方法之一提交 osql 作业。您可以: • 指定单个 Transact-SQL 语句。

- 或 -

 
• 将该工具指向一个脚本文件。
下面将详细介绍每一种方法。

指定单个 Transact-SQL 语句

如要针对 MSDE 2000 的本地默认实例运行 Transact-SQL,请键入与下面这一个类似的命令:

osql -E -q "Transact-SQL statement"

其中

• -E 表示使用 Microsoft Windows NT 身份验证。

-而-

 
• -q 表示运行 Transact-SQL 语句,但是在查询结束时不退出 osql。
如要运行 Transact-SQL 语句并退出 osql,请使用 -Q 参数来代替 -q。

将该工具指向一个脚本文件

如要将该工具指向一个脚本文件,请按照下列步骤操作: 1. 创建一个包含一批 Transact-SQL 语句的脚本文件(如 myQueries.sql)。
2. 打开命令提示符,键入与下面类似的一个命令,然后按 ENTER 键:

osql -E -i input_file

其中

input_file 是脚本文件及其完整路径。例如,如果脚本文件 myQueries.sql 在 C:\Queries 文件夹中,请将参数 input_file 替换为 C:\Queries\myQueries.sql。

该脚本文件的运行结果将出现在控制台窗口中。如果您想将运行结果定向到一个文件,请向上述命令中添加 -ooutput_file 参数。例如:

osql -E -i input_file -o output_file

其中

output_file 是输出文件及其完整路径。

如想消除输出结果中的编号和提示符号,请向上述命令中添加 -n 选项。例如:

osql -E -i input_file -o output_file -n

 回到顶端

连接到 SQL Server 桌面引擎 (MSDE 2000)
如要连接到 MSDE 2000,请按照下列步骤操作: 1. 确认 MSDE 2000 正在运行。
2. 在承载您要连接的 MSDE 2000 实例的计算机上打开一个命令窗口。
3. 键入下面的命令,然后按 ENTER 键:

osql -E

这可以通过使用 Windows 身份验证将您连接到 MSDE 2000 的本地默认实例。

如要连接到 MSDE 2000 的一个命名实例,请键入:

osql -E -S servername\instancename

如果您收到了下面的错误消息,表明 MSDE 2000 可能未在运行,或者您可能为安装的 MSDE 2000 的命名实例提供了错误的名称:
[Shared Memory]SQL Server does not exist or access denied.
[Shared Memory]ConnectionOpen (Connect()).
如果您成功连接到了该服务器,就会出现下面的提示:


   1>
      
此提示表示 osql 已启动。现在,您可以交互输入 Transact-SQL 语句,运行结果将出现在命令提示行上。 

 回到顶端

管理 MSDE 2000
本文下面的部分将向您简单介绍管理 MSDE 2000 时最常用的 Transact-SQL 命令。


新建登录帐户
未提供有效登录 id 的用户无法连接到 SQL Server。可调用 sp_grantlogin 存储过程来授权一个 Microsoft Windows 网络帐户(一个组或者一个用户帐户),使之作为一个使用 Windows 身份验证连接到 SQL Server 实例的 SQL Server 登录帐户。下面的示例允许一个名为 Corporate\Test 的 Windows NT 用户连接到 SQL Server 实例:
EXEC sp_grantlogin 'Corporate\Test'
    
只有 sysadmin 或 securityadmin 固定服务器角色的成员可以运行 sp_grantlogin 存储过程。有关这些角色的更多信息,请参见“SQL Server 联机图书”中“Roles, SQL Server Architecture”主题。

有关 sp_grantlogin 存储过程的更多信息,请参见“SQL Server 联机图书”中的“sp_grantlogin, Transact-SQL Reference”主题。

您可以使用 sp_addlogin 存储过程创建一个使用 SQL Server 身份验证建立 SQL Server 连接的新登录帐户。下面的示例为一个名叫“test”的用户创建了一个密码为“hello”的 SQL Server 登录:
EXEC sp_addlogin 'test','hello'
    
只有 sysadmin 和 securityadmin 固定服务器角色的成员可以运行 sp_addlogin 存储过程。有关 sp_addlogin 存储过程的更多信息,请参见“SQL Server 联机图书”中的“sp_addlogin, Transact-SQL Reference”主题。


访问数据库
在用户连接到 SQL Server 的一个实例后,他们只有在 dbo 授予他们对数据库的访问权后才可以在数据库中执行活动。您可以使用 sp_grantdbaccess 存储过程为新用户向当前数据库中添加一个安全帐户。下面的示例为一个名叫 Corporate\BobJ 的 Microsoft Windows NT 的用户向当前数据库添加了一个帐户,并将其命名为“Bob”:

EXEC sp_grantdbaccess 'Corporate\BobJ', 'Bob'
    

sp_adduser 存储过程执行与 sp_grantdbaccess 存储过程相同的功能。因为包括 sp_adduser 存储过程是为了向后兼容,所以 Microsoft 建议您使用 sp_grantdbacess 存储过程。

只有 sysadmin 固定服务器角色、db_accessadmin 和 db_owner 固定数据库角色的成员才可以运行 sp_grantdbaccess 存储过程。有关 sp_grantdbaccess 存储过程的更多信息,请参见“SQL Server 联机图书”中的“sp_grantdbaccess, Transact-SQL Reference”主题。


如何更改登录密码
如要修改登录密码,请使用 sp_password 存储过程。下面的示例将“test”登录的密码从“ok”更改为“hello”:
EXEC sp_password 'ok', 'hello','test'
    

执行权限默认授予正在更改其自己的登录密码的用户的公共角色。只有 sysadmin 角色才可以为其他用户更改登录密码。有关 sp_password 存储过程的更多信息,请参见“SQL Server 联机图书中”的“sp_password, Transact-SQL Reference”主题。
创建数据库
MSDE 2000 数据库由一个表的集合组成,这些表中包含数据和其他对象,如视图、索引、存储过程和事件触发器,这些内容定义为支持对数据执行的各种活动。如要创建 MSDE 2000 数据库,请使用“CREATE DATABASE”Transact-SQL 命令。有关 创建数据库的更多信息,请参见“SQL Server 联机图书”中的“Creating a Database”主题。

下面的示例创建了一个名为 Test 的数据库。因为没有向该命令行添加其他参数,所以 Test 数据库将与 model 数据库大小相同:
CREATE DATABASE Test
    
CREATE DATABASE 权限默认授予 sysadmin 和 dbcreator 固定服务器角色的成员。有关“CREATE DATABASE”命令的更多信息,请参见“SQL Server 联机图书”中的“CREATE DATABASE, Transact-SQL Reference”主题。

如要创建一个新的数据库对象,请使用“CREATE Transact-SQL”命令。例如,要新建一个表,请使用“CREATE TABLE”Transact-SQL 命令。有关更多信息,请参考“SQL Server 联机图书”。


备份和还原数据库
SQL Server 的备份和还原组件为保护存储在 SQL Server 数据库中的关键数据提供了一个重要的保护措施。

通过适当的规划,您可以从许多故障中恢复,包括:
• 存储媒体故障。
• 用户错误。
• 服务器的永久丢失。 
另外,备份和还原数据库还有其他方面的用途,例如将数据库从一个服务器复制到另一个服务器。通过从一台计算机上备份一个数据库和将此数据库还原到另一台计算机上,您可以快速方便地制作数据库的副本。

有关数据库备份和还原操作方面的更多信息,请参见“SQL Server 联机图书”中的“Backing Up and Restoring Databases”主题。

下面的示例为一个名为 mydb的数据库执行完全数据库备份,将此备份命名为 Mydb.bak,然后将此备份存储在 C:\Msde\Backup 文件夹中。


BACKUP DATABASE mydb TO DISK = 'C:\MSDE\Backup\mydb.bak'
    

下面的示例为一个名为 mydb 的数据库执行日志备份,将此备份命名为 Mydb_log.bak,然后将其存储在 C:\Msde\Backup 文件夹中:


BACKUP LOG mydb TO DISK = 'C:\MSDE\Backup\mydb_log.bak'
    

BACKUP DATABASE 和 BACKUP LOG 权限默认授予 sysadmin 固定服务器角色以及 db_owner 和 db_backupoperator 固定数据库角色的成员。有关 BACKUP 语句的更多信息,请参见“SQL Server 联机图书”中的“BACKUP, Transact-SQL Reference”主题。


MSDE 包括 SQL Server 代理程序服务用以管理安排的作业。例如,您可以创建并安排一个 Transact-SQL 备份作业。SQL Server 代理程序服务管理作业安排。如想查看演示如何在 MSDE 2000 中使用各种存储过程执行和安排备份的示例代码,请参见下面的 Microsoft 知识库文章:
241397 (http://support.microsoft.com/kb/241397/EN-US/) HOWTO:Back Up a Microsoft Data Engine Database with Transact-SQL
有关 SQL Server 代理程序服务的更多信息,请参见“SQL Server 联机图书”中的“SQL Server Agent Service”主题。

备份数据库只是全部过程的一半。知道如何从备份中还原数据库也非常重要。下面的示例将一个名为 mydb 的数据库从备份文件 C:\Msde\Backup\Mydb.bak 中还原:


RESTORE DATABASE mydb FROM DISK ='C:\MSDE\Backup\mydb.bak'
    
如果将要还原的数据库不存在,则用户必须具有 CREATE DATABASE 权限才可以运行 RESTORE 语句。如果该数据库存在,则 RESTORE 权限默认授予 sysadmin 和 dbcreator 固定服务器角色的成员,以及该数据库的所有者 (dbo)。有关 RESTORE 语句的更多信息,请参见“SQL Server 联机图书”中的“RESTORE, Transact-SQL Reference”主题。
附加和分离数据库
可以分离一个数据库的数据和事务日志文件然后将其重新附加到另一个服务器,或重新附加到同一服务器。分离一个数据库虽然从 SQL Server 中删除了该数据库,但构成该数据库的数据和事务日志文件没有任何改动。 然后您可以使用这些数据和事务日志文件将该数据库附加到任何 SQL Server 实例,其中包括从中分离该数据库的那一服务器。这使该数据库能够以与在被分离时完全相同的状态供在其他位置使用。有关更多信息,请参见 “SQL Server 联机图书”中的“Attaching and Detaching a Database”主题。

下面的示例将一个名为 mydb 的数据库从 SQL Server 的当前实例中分离出来:
EXEC sp_detach_db 'mydb'
    
只有 sysadmin 固定服务器角色的成员才可以运行 sp_detach_db 存储过程。有关 sp_detach_db 存储过程的更多信息,请参见“SQL Server 联机图书”中的“sp_detach_db, Transact-SQL Reference”主题。

下面的示例将来自名为 mydb 的数据库的两个文件附加到 SQL Server 的当前实例:
EXEC sp_attach_db @dbname = N'mydb',
   @filename1 = N'C:\MSDE\Backup\mydb.mdf',
   @filename2 = N'C:\MSDE\Backup\mydb.ldf'
    
大写字母“N”用来给“Unicode 字符串”常量添加前缀。“N”前缀代表 SQL-92 标准中的区域语言。有关详细信息,请参见 Microsoft 知识库中的以下文章:
239530 (http://support.microsoft.com/kb/239530/EN-US/) INF:Unicode String Constants in SQL Server Require N Prefix
只有 sysadmin 和 dbcreator 固定服务器角色的成员才可以运行此过程。有关 sp_attach_db 存储过程的更多信息,请参见“SQL Server 联机图书”中的“sp_attach_db, Transact-SQL Reference”主题。 下面关于 osql 工具使用方面的信息适用于所有版本的 Microsoft SQL Server 2000。


 回到顶端

参考
如要下载“SQL Server 2000 联机图书”的更新版本,请访问下面的 Microsoft Web 站点:
http://www.microsoft.com/sql/techinfo/productdoc/2000/books.asp (http://support.microsoft.com/?scid=http%3a%2f%2fwww.microsoft.com%2fsql%2ftechinfo%2fproductdoc%2f2000%2fbooks.asp)
如要下载“SQL Server 联机图书”的 SQL Server 7.0 版,请访问下面的 Microsoft Web 站点:
http://download.microsoft.com/download/SQL70/File/2/Win98/En-US/SQLBOL.exe (http://download.microsoft.com/download/sql70/file/2/win98/en-us/sqlbol.exe)
有关 MSDE 2000 的更多信息,请参见下列 Microsoft 知识库文章:
319930 (http://support.microsoft.com/kb/319930/EN-US/) HOW TO:Connect to Microsoft Desktop Engine
241397 (http://support.microsoft.com/kb/241397/EN-US/) HOWTO:Back Up a Microsoft Desktop Engine Database with Transact-SQL

sqlcmd 实用工具 

已更新: 2006 年 7 月 17 日

使用 sqlcmd 实用工具,可以在命令提示符处、SQLCMD 模式下的查询编辑器、Windows 脚本文件或 SQL Server 代理作业的操作系统 (Cmd.exe) 作业步骤中,输入 Transact-SQL 语句、系统过程和脚本文件。此实用工具使用 OLE DB 执行 Transact-SQL 批处理。

重要事项:
在查询编辑器的常规模式和 SQLCMD 模式下,SQL Server Management Studio 使用 Microsoft .NET Framework SqlClient 执行批处理。从命令行运行 sqlcmd 时,sqlcmd 将使用 OLE DB 访问接口。由于可以应用不同的默认选项,因此在 SQL Server Management Studio SQLCMD 模式下以及在 sqlcmd 实用工具中执行相同的查询时,可能会看到不同的行为。

 

 

命令行选项命令行选项
登录相关选项

 

-U login_id

用户登录 ID。登录 ID 区分大小写。

注意:
OSQLUSER 环境变量可用于实现向后兼容性。SQLCMDUSER 环境变量优先于 OSQLUSER 环境变量。也就是说,sqlcmd 和 osql 可以彼此相邻使用而不会相互干扰。此外,现有的 osql 脚本可以继续使用。

 

 

如果 -U 选项和 -P 选项均未指定,sqlcmd 将尝试使用 Microsoft Windows 身份验证模式进行连接。身份验证基于运行 sqlcmd 的用户的 Windows 帐户。

如果 -U 选项与 -E 选项(将在本主题的后面进行说明)一起使用,将生成错误消息。如果 –U 选项后有多个参数,将生成错误消息并退出程序。

-P password

用户指定的密码。密码是区分大小写的。如果使用了 -U 选项而未使用 -P 选项,并且未设置 SQLCMDPASSWORD 环境变量,则 sqlcmd 会提示用户输入密码。如果在命令提示符的末尾使用 -P 选项而不带密码,sqlcmd 将使用默认密码 (NULL)。

安全说明:
不要使用空密码。请使用强密码。有关详细信息,请参阅强密码

 

 

通过向控制台输出密码提示,可以显示密码提示,如下所示:Password:

隐藏用户输入。也就是说,将不会显示任何输入的内容,光标保留原位不动。

使用 SQLCMDPASSWORD 环境变量可以为当前会话设置默认密码。因此,不必将密码硬编码到批处理文件中。

以下示例首先在命令提示符处设置 SQLCMDPASSWORD 变量,然后访问 sqlcmd 实用工具。在命令提示符下,键入:

SET SQLCMDPASSWORD= p@a$$w0rd

安全说明:
任何可以看到计算机监视器的人均可看到密码。

 

 

在以下命令提示符处键入:

sqlcmd

如果用户名和密码组合不正确,OLE DB 访问接口将生成错误消息。

注意:
为实现向后兼容性而保留了 OSQLPASSWORD 环境变量。SQLCMDPASSWORD 环境变量优先于 OSQLPASSWORD 环境变量;也就是说 sqlcmd 和 osql 可以彼此相邻使用而不会相互干扰,并且旧式脚本可以继续使用。

 

 

如果将 -P 选项与 -E 选项一起使用,将生成错误消息。

如果 –P 选项后有多个参数,将生成错误消息并退出程序。

-E trusted connection

使用可信连接而不是用户名和密码登录 SQL Server。默认情况下,如果未指定 -E,sqlcmd 将使用可信连接选项。

-E 选项会忽略可能的用户名和密码环境变量设置,例如 SQLCMDPASSWORD。如果将 -E 选项与 -U 选项或 -P 选项一起使用,将生成错误消息。

-z new password

更改密码:

sqlcmd -U someuser -P s0mep@ssword -z a_new_p@a$$w0rd

-Z new password and exit

更改密码并退出:

sqlcmd -U someuser -P s0mep@ssword -Z a_new_p@a$$w0rd

-S server_name [ \instance_name ]

指定要连接的 SQL Server 的实例。它设置 sqlcmd 脚本变量 SQLCMDSERVER。

指定 server_name 将连接到该服务器中 SQL Server 的默认实例。指定 server_name\instance_name 将连接到该服务器中 SQL Server 的命名实例。如果未指定服务器,sqlcmd 将连接到本地计算机上的 SQL Server 的默认实例。从网络上的远程计算机执行 sqlcmd 时,此选项是必需的。

如果在启动 sqlcmd 时未指定用户名,SQL Server 将检查并使用 SQLCMDSERVER 环境变量。如果未指定服务器,则使用工作站名称。

注意:
为实现向后兼容性而保留了 OSQLSERVER 环境变量。SQLCMDSERVER 环境变量优先于 OSQLSERVER 环境变量;也就是说 sqlcmd 和 osql 可以彼此相邻使用而不会相互干扰,并且旧式脚本可以继续使用。

 

 

-H wksta_name

工作站的名称。此选项设置 sqlcmd 脚本变量 SQLCMDWORKSTATION。该工作站名称在 sys.processes 目录视图的 hostname 列中列出,并可使用存储过程 sp_who 返回。如果不指定此选项,则默认为当前计算机名称。此名称可用来标识不同的 sqlcmd 会话。

-d db_name

启动 sqlcmd 时发出一个 USE db_name 语句。此选项设置 sqlcmd 脚本变量 SQLCMDDBNAME。它指定初始数据库。默认为您的登录名的默认数据库属性。如果数据库不存在,则生成错误消息且 sqlcmd 退出。

-l login time_out

指定在您尝试连接到服务器时 OLE DB 访问接口的 sqlcmd 登录超时时间(以秒计)。此选项设置 sqlcmd 脚本变量 SQLCMDLOGINTIMEOUT。登录 sqlcmd 的默认超时时间为 8 秒。登录超时设定必须是介于 0 和 65534 之间的数字。如果提供的值不是数值或不在此范围内,sqlcmd 将生成错误消息。该值为 0 时,则允许无限制等待。

-A dedicated admin connection

使用专用管理员连接 (DAC) 登录到 SQL Server。此类型连接用于排除服务器故障。这只适用于支持 DAC 的服务器。如果 DAC 不可用,sqlcmd 会生成错误消息,然后退出。有关 DAC 的详细信息,请参阅使用专用管理员连接

输入/输出选项

 

-i input_file[,input_file2...]

标识包含一批 SQL 语句或存储过程的文件。可以指定要按顺序读取和处理的多个文件。文件名之间不要使用任何空格。sqlcmd 将首先检查所有指定的文件是否都存在。如果有一个或多个文件不存在,sqlcmd 将退出。-i 和 -Q/-q 选项是互斥的。

路径示例:

-i C:\<filename>

-i \\<Server>\<Share$>\<filename>

-i "C:\Some Folder\<file name>。

包含空格的文件名必须用引号引起来。

此选项可能不止使用一次:-i input_file -i I input_file.

-o output_file

标识从 sqlcmd 接收输出的文件。

如果指定了 -u,则 output_file 以 Unicode 格式存储。如果文件名无效,将生成一个错误消息,并且 sqlcmd 将退出。sqlcmd 不支持向同一文件并发写入多个 sqlcmd 进程。文件输出将损坏或不正确。有关文件格式的详细信息,请参阅 -f 开关。如果此文件不存在,将创建此文件。前一个 sqlcmd 会话中的同名文件将被覆盖。此处指定的文件不是 stdout 文件。如果指定了 stdout 文件,将不使用此文件。

路径示例:

-o C:\<filename>。

-o \\<Server>\<Share$>\<filename>。

-o "C:\Some Folder\<file name>"。

包含空格的文件名必须用引号引起来。

-f < codepage > | i: < codepage > [ < , o: < codepage > ]

指定输入和输出代码页。代码页页码是指定已安装的 Windows 代码页的数值。有关详细信息,请参阅安装程序中的排序规则设置

代码页转换规则:

  • 如果未指定代码页,sqlcmd 会将当前代码页同时用于输入文件和输出文件,除非输入文件为 Unicode 文件,在此情况下无需进行转换。
  • sqlcmd 自动识别 Big-endian Unicode 和 Little-endian Unicode 输入文件。如果已指定 -u 选项,输出将始终为 Little-endian Unicode。
  • 如果未指定输出文件,输出代码页将为控制台代码页。这将使输出正确显示在控制台上。
  • 假定多个输入文件具有相同的代码页。可以将 Unicode 和非 Unicode 输入文件混合在一起。

在命令提示符处输入 chcp 以验证 Cmd.exe 的代码页。

-u unicode output

指定无论 input_file 为何种格式,output_file 都以 Unicode 格式进行存储。

-r [ 0 | 1] msgs to stderr

将错误消息输出重定向到屏幕 (stderr)。如果未指定参数或指定参数为 0,则仅重定向严重级别为 11 或更高的错误消息。如果指定参数为 1,则将重定向所有消息输出(包括 PRINT)。如果使用 -o,将不起任何作用。默认情况下,消息将发送到 stdout。

-R use client regional settings

设置 SQL Server OLE DB 访问接口,使其在将货币、日期和时间数据转换为字符数据时使用客户端区域设置。默认为服务器区域设置。

查询执行选项

 

-q " cmdline query "

启动 sqlcmd 时执行查询,但是在查询结束运行时不退出 sqlcmd。可以执行多个以分号分隔的查询。将查询用引号引起来,如下例所示。

在命令提示符下,键入:

sqlcmd -d AdventureWorks -q "SELECT FirstName, LastName FROM Person.Contact WHERE LastName LIKE 'Whi%';"

sqlcmd -d AdventureWorks -q "SELECT TOP 5 FirstName FROM Person.Contact;SELECT TOP 5 LastName FROM Person.Contact;"

重要事项:
请不要在查询中使用 GO 终止符。

 

 

如果在指定此选项的同时还指定了 -b,sqlcmd 在遇到错误时将退出。本主题的后面将介绍 -b。

-Q " cmdline query " and exit

在 sqlcmd 启动时执行查询,随后立即退出 sqlcmd。可以执行多个以分号分隔的查询。

将查询用引号引起来,如下例所示。

在命令提示符下,键入:

sqlcmd -d AdventureWorks -Q "SELECT FirstName, LastName FROM Person.Contact WHERE LastName LIKE 'Whi%';"

sqlcmd -d AdventureWorks -Q "SELECT TOP 5 FirstName FROM Person.Contact;SELECT TOP 5 LastName FROM Person.Contact;"

重要事项:
请不要在查询中使用 GO 终止符。

 

 

如果在指定此选项的同时还指定了 -b,sqlcmd 在遇到错误时将退出。本主题的后面将介绍 -b。

-e echo input

将输入脚本写入标准输出设备 (stdout)。

-I enable Quoted Identifiers

将 SET QUOTED_IDENTIFIER 连接选项设置为 ON。默认情况下,此选项设置为 OFF。有关详细信息,请参阅 SET QUOTED_IDENTIFIER (Transact-SQL)

-t query time_out

指定命令(或 SQL 语句)超时的时间。此选项设置 sqlcmd 脚本变量 SQLCMDSTATTIMEOUT。如果未指定 time_out 值,则命令将不会超时。query time_out 必须是介于 1 和 65535 之间的数字。如果提供的值不是数值或不在此范围内,则 sqlcmd 将生成错误消息。

注意:
实际的超时值可能会与指定的 time_out 值相差几秒。

 

 

 

-v var=value[ var=value...] ,

创建可用于 sqlcmd 脚本中的 sqlcmd 脚本变量。如果该值包含空格,则将其用引号引起来。可以指定多个 var="values" 值。如果指定的任何值中有错误,sqlcmd 会生成错误消息,然后退出。

sqlcmd -v MyVar1=something MyVar2="some thing"

sqlcmd -v MyVar1=something -v MyVar2="some thing"

-x disable variable substitution

导致 sqlcmd 忽略脚本变量。当脚本中包含多个 INSERT 语句,并且这些语句可能包含格式与常规变量(如 $(variable_name))相同的字符串时,这一选项很有用。

格式设置选项

 

-h headers

指定要在列标题之间输出的行数。默认为每一组查询结果输出一次标题。此选项设置 sqlcmd 脚本变量 SQLCMDHEADERS。使用 -1 指定不能输出标题。如果使用 -1,则参数和设置之间不能有空格(可以是 -h-1,但不能是 -h -1)。任何无效的值都将导致 sqlcmd 生成错误消息,然后退出。

-s col_separator

指定列分隔符字符。默认为空格。此选项设置 sqlcmd 脚本变量 SQLCMDCOLSEP。若要使用对操作系统有特殊含义的字符,如“与”符号 (&) 或分号 (;),请将该字符用双引号 (") 引起来。列分隔符可以是任意 8 位字符。

-w column_width

指定用于输出的屏幕宽度。此选项设置 sqlcmd 脚本变量 SQLCMDCOLWIDTH。该列宽必须是介于 8 和 65536 之间的数字。如果指定的列宽不在此范围内,则 sqlcmd 将生成错误消息。默认宽度为 80 个字符。在输出行超出指定的列宽时,将转到下一行。

-W remove trailing spaces

此选项删除列的尾随空格。在准备要导出到另一应用程序的数据时,请将此选项和 -s 选项结合使用。不能与 -y 或 -Y 选项结合使用。

-k [ 1 | 2 ] remove[replace] control characters

删除输出中的所有控制字符,例如制表符和换行符。这会在返回数据时保留列格式。如果指定了 1,则控制字符被一个空格替代。如果指定了 2,则连续的控制字符被一个空格替代。

-y display_width

设置 sqlcmd 脚本变量 SQLCMDMAXFIXEDTYPEWIDTH。默认值为 0 (未设置)。它限制为下列大型可变长度数据类型返回的字符数:

  • varchar(max)
  • nvarchar(max)
  • varbinary(max)
  • xml
  • UDT(用户定义数据类型)
  • text
  • ntext
  • image
注意:
根据实现,UDT 可以使用固定的长度。如果此固定长度 UDT 的长度比 display_width 短,则返回的 UDT 值将不会受影响。但是,如果此长度比 display_width 长,则输出将会被截断。

 

 

如果 display_width 为 0,则输出将会在 1 MB 处截断。您可以使用 :XML ON 命令防止输出被截断。本主题的后面将介绍 :XML ON 命令。

重要事项:
使用 -y 0 选项时要特别注意,因为根据返回的数据量大小,此选项可能导致服务器和网络上出现严重性能问题。

 

 

-Y display_width

设置 sqlcmd 脚本变量 SQLCMDMAXVARTYPEWIDTH。默认值为 256。它限制为以下数据类型返回的字符数:

  • char
  • nchar
  • varchar(n),其中 1<n<8000
  • nvarchar(n),其中 1<n<4000
  • sql_variant
错误报告选项

 

-b on error batch abort

指定错误发生时 sqlcmd 退出并返回一个 DOS ERRORLEVEL 值。当 SQL Server 错误消息的严重级别高于 10 时,返回给 DOS ERRORLEVEL 变量的值为 1;否则返回的值为 0。如果除 -b 选项外还设置了 -V 选项,则当严重等级低于使用 -V 设置的值时,sqlcmd 将不报告错误。命令提示符批处理文件可以测试 ERRORLEVEL 的值并适当处理错误。sqlcmd 不对严重级别 10 报告错误(信息性消息)。

如果 sqlcmd 脚本包含错误的注释、语法错误或缺少脚本变量,则返回的 ERRORLEVEL 为 1。

-V severitylevel

指定 sqlcmd 报告的最低严重级别。Transact-SQL 脚本中发生错误时,仅当严重级别大于或等于由 -V 开关指定的值时,才报告严重级别。如果严重级别低于该值,则报告 0。默认错误级别为 0。命令提示符批处理文件可以测试 ERRORLEVEL 的值并适当处理错误。

-m error_level

自定义错误消息的显示。显示高于指定严重级别的错误的消息号、状态和错误级别。而不显示严重级别低于指定级别的错误的信息。用 -1 指定与消息一起返回所有标题,即使是信息性的消息。如果指定了 -1,则在参数和设置之间不能有空格(例如,可以是 -m-1,但不能是 -m -1)。

该选项设置 sqlcmd 脚本变量 SQLCMDERRORLEVEL(其默认值为 0)。

其他选项

 

-a packet_size

需要不同大小的数据包。该选项设置 sqlcmd 脚本变量 SQLCMDPACKETSIZE。packet_size 必须是介于 512 和 32767 之间的值。默认值为 4096。如果脚本的两个 GO 命令之间包含大量 SQL 语句,则使用较大的数据包可以提高脚本执行的性能。您可以请求更大的包大小。但是,如果请求遭拒绝,sqlcmd 将对包大小使用服务器默认值。

-c cmd_end

指定批处理终止符。默认情况下,通过单独在一行中键入“GO”来终止命令并将其发送到 SQL Server。重置批处理终止符时,不要使用对操作系统具有特殊意义的 Transact-SQL 保留关键字或字符,即便它们前面有反斜杠也是如此。

-L [ c ] list servers[clean output]

列出在本地配置的服务器和在网络上广播的服务器的名称。此参数不能与其他参数结合使用。可以列出的服务器的最大数目是 3000。如果服务器列表由于缓冲区大小而被截断,则会显示错误消息。

注意:
鉴于网络广播的特点,sqlcmd 不可能及时接收来自所有服务器的响应。因此,每次调用该选项所返回的服务器列表都可能不同。

 

 

如果指定可选参数 c,则输出不会显示 Servers: 标题行,并且列出的每个服务器行都没有前导空格。这被称为清除输出。清除输出可以提高脚本语言的处理性能。

-p [ 1 ] print statistics[colon format]

输出每个结果集的性能统计信息。以下示例是性能统计信息的格式:

Network packet size (bytes): n

x xact[s]:

Clock Time (ms.): total t1 avg t2 (t3 xacts per sec.)

其中:

x = SQL Server 处理的事务数。

t1 = 所有事务的总时间。

t2 = 单个事务的平均时间。

t3 = 每秒的平均事务数。

所有时间均以毫秒表示。

如果指定了可选参数 1,则统计信息的输出格式为以冒号分隔的格式,此格式可以由脚本轻松导入到电子表格中或进行处理。

如果可选参数是除 1 之外的任何值,则将生成错误并且 sqlcmd 将退出。

-X [ 1 ] disable commands, startup script, enviroment variables [and exit]

从批处理文件执行 sqlcmd 时,将禁用可能危及系统安全的命令。禁用的命令仍然可以被识别;sqlcmd 发出警告消息并继续。如果指定了可选参数 1,则 sqlcmd 将生成错误消息,然后退出。使用 -X 选项时,将禁用以下命令:

  • ED
  • !! command

如果指定 -X 选项,它会阻止将环境变量传递给 sqlcmd。同时该选项还会阻止执行通过使用 SQLCMDINI 脚本变量指定的启动脚本。有关 sqlcmd 脚本变量的详细信息,请参阅将 sqlcmd 与脚本变量结合使用

-? show syntax summary

显示 sqlcmd 选项的语法摘要。

备注备注

不必按语法部分所示的顺序使用选项。

在返回多个结果时,sqlcmd 在批处理中的每个结果集之间输出一个空行。此外,如果没有应用于已执行的语句,则“<x> 行受影响”消息不会出现。

若要交互使用 sqlcmd,请在命令提示符处使用本主题前面介绍的一个或多个选项键入 sqlcmd。有关详细信息,请参阅使用 sqlcmd 实用工具

注意:
-L、-Q、-Z 或 -i 选项会导致 sqlcmd 在完成执行后退出。

 

 

sqlcmd 命令行在命令环境 (Cmd.exe) 中的总长度(包括所有参数和扩展变量)取决于 Cmd.exe 所在的操作系统。具体长度因操作系统不同而异。在 Windows Server 2003 和 Windows XP 中,其长度为 8191;而在 Windows 2000 和 Windows NT4 中,则为 2047。

sqlcmd 命令sqlcmd 命令

除 sqlcmd 中的 Transact-SQL 语句之外,还可使用以下命令:

GO [count]

:List

[:] RESET

:Error

[:] ED

:Out

[:] !!

:Perftrace

[:] QUIT

:Connect

[:] EXIT

:On Error

:r

:Help

:ServerList

:XML [ON | OFF]

:Setvar

:Listvar

使用 sqlcmd 命令时,请注意以下事项:

  • 除 GO 以外,所有 sqlcmd 命令必须以冒号 (:) 为前缀。
    重要事项:
    为了保持现有 osql 脚本的向后兼容性,有些命令会被视为不带冒号。这由 [:] 指示。

     

     

  • sqlcmd 命令只有出现在一行的开头时,才能够被识别。
  • 所有 sqlcmd 命令都不区分大小写。
  • 每个命令都必须位于单独的行中。命令后面不能跟随 Transact-SQL 语句或其他命令。
  • 命令将被立即执行。它们与 Transact-SQL 语句不同,并未放在执行缓冲区中。
编辑命令

 

[:] ED

启动文本编辑器。该编辑器可以用来编辑当前的 Transact-SQL 批处理或上次执行的批处理。若要编辑上次执行的批处理,必须在上一批处理执行完之后立即键入 ED 命令。

文本编辑器由 SQLCMDEDITOR 环境变量定义。默认编辑器为“Edit”。若要更改编辑器,请设置 SQLCMDEDITOR 环境变量。例如,若要将编辑器设置为 Microsoft 记事本,请在命令提示符处键入:

SET SQLCMDEDITOR=notepad

[:] RESET

清除语句缓存。

:List

输出语句缓存的内容。

变量

 

:Setvar <var> [ "value" ]

定义 sqlcmd 脚本变量。脚本变量具有如下格式:$(VARNAME)

变量名称不区分大小写。

可以通过下列方式设置脚本变量:

  • 隐式使用命令行选项。例如,-l 选项设置 SQLCMDLOGINTIMEOUT sqlcmd 变量。
  • 显式使用 :Setvar 命令。
  • 在运行 sqlcmd 之前定义一个环境变量。
注意:
-X 选项可防止将环境变量传递给 sqlcmd。

 

 

如果使用 :Setvar 定义的变量和某个环境变量同名,则使用 :Setvar 定义的变量优先。

变量名中不能包含空格字符。

变量名不能与变量表达式(如 $(var))具有相同的形式。

如果脚本变量的字符串值中含有空格,请用引号将该值引起来。如果未指定脚本变量的值,则将删除该脚本变量。

:Listvar

显示当前设置的脚本变量列表。

注意:
只显示由 sqlcmd 设置的脚本变量和使用 :Setvar 命令设置的脚本变量。

 

 

输出命令

 

:Error <filename>|STDERR|STDOUT

将所有错误输出重定向到 file name 指定的文件、stderr 或 stdout。Error 命令可以在一个脚本中多次出现。默认情况下,错误输出将发送到 stderr。

file name

创建并打开一个要接收输出的文件。若该文件已经存在,则将其截断为零字节。若该文件不可用(由于权限或其他原因),将不会切换输出,也不会将输出发送到上次指定的目标或默认目标。

STDERR

将错误输出切换至 stderr 流。如果已经重定向,流的重定向目标将会收到错误输出。

STDOUT

将错误输出切换至 stdout 流。如果已经重定向,流的重定向目标将会收到错误输出。

:Out < filename>| STDERR| STDOUT

创建所有查询结果并将它们重定向到 file name 指定的文件、stderr 或 stdout。默认情况下,输出将发送到 stdout。若该文件已经存在,则将其截断为零字节。Out 命令可以在一个脚本中多次出现。

:Perftrace < filename>| STDERR| STDOUT

创建所有性能跟踪信息并将它们重定向到 file name 指定的文件、stderr 或 stdout。默认情况下,性能跟踪输出将发送到 stdout。若该文件已经存在,则将其截断为零字节。Perftrace 命令可以在一个脚本中多次出现。

执行控制命令

 

:On Error[ exit| ignore]

设置在脚本或批处理执行过程中发生错误时要执行的操作。

使用 exit 选项时,sqlcmd 退出,并显示相应的错误值。

使用 ignore 选项时,sqlcmd 会忽略错误,并继续执行批处理或脚本。默认情况下,会输出错误消息。

[:] QUIT

导致 sqlcmd 退出。

[:] EXIT[ (statement) ]

允许您将 SELECT 语句的结果用作 sqlcmd 的返回值。第一个结果行的第一列转换为 4 字节的整数(长整型)。MS-DOS 将低字节传递给父进程或操作系统错误级别。Windows 2000 传递整个 4 字节整数。语法为:

:EXIT(query)

例如:

:EXIT(SELECT @@ROWCOUNT)

您还可以在批处理文件中包含 EXIT 参数。例如,在命令提示符处键入:

sqlcmd -Q "EXIT(SELECT COUNT(*) FROM '%1')"

sqlcmd 实用工具将圆括号 ( ) 中的所有内容发送给服务器。如果系统存储过程选择了一个集合并返回一个值,则仅返回选择的内容。如果圆括号中没有任何内容,则 EXIT ( ) 语句会执行批处理中此语句前的所有内容,然后退出,且不返回任何值。

当指定了错误查询时,sqlcmd 将退出,且不返回任何值。

下面是 EXIT 格式的列表:

  • :EXIT

不执行批处理就立即退出,无返回值。

  • :EXIT( )

执行批处理后退出,不返回值。

  • :EXIT(query)

执行包括查询的批处理,返回查询的结果后退出。

如果在 sqlcmd 脚本中使用 RAISERROR,并且出现状态 127,则 sqlcmd 将退出,并将消息 ID 返回给客户端。例如:

RAISERROR(50001, 10, 127)

该错误会导致 sqlcmd 脚本终止并将消息 ID 50001 返回给客户端。

SQL Server 保留了介于 -1 到 -99 之间的返回值;sqlcmd 定义了以下附加返回值:

返回值 说明

-100

选择返回值前遇到错误。

-101

选择返回值时找不到行。

-102

选择返回值时发生转换错误。

GO [count]

GO 在批处理和执行任何缓存 Transact-SQL 语句结尾时会发出信号。在为 count 指定一个值时,缓存的语句会被作为单个批处理执行 count 次。

其他命令

 

:r < filename>

将来自通过 <filename> 所指定文件的其他 Transact-SQL 语句和 sqlcmd 命令分析到语句缓存中。

如果文件包含的 Transact-SQL 语句后面没有跟随 GO,则必须在 :r 的随后一行中输入 GO。

注意:
系统会相对于 sqlcmd 在其中运行的启动目录读取 <filename>。

 

 

当遇到批处理终止符之后,将读取并执行该文件。可以发出多个 :r 命令。该文件可以包含任何 sqlcmd 命令。包括批处理终止符 GO。

注意:
每遇到一个 :r 命令,交互模式下显示的行计数都会加一。:r 命令会出现在 list 命令的输出中。

 

 

:Serverlist

列出在本地配置的服务器和在网络上广播的服务器的名称。

:Connect server_name[\instance_name] [-l timeout] [-U user_name [-P password]] ,

连接到 SQL Server 的一个实例。同时关闭当前的连接。

超时选项:

0

永远等待

n>0

等待 n 秒钟

SQLCMDSERVER 脚本变量将反映当前的活动连接。

如果未指定 timeout,则其默认值将为 SQLCMDLOGINTIMEOUT 变量的值。

仅当指定了 user_name(作为选项或环境变量)时,才会提示用户输入密码。如果已设置 SQLCMDUSER 或 SQLCMDPASSWORD 环境变量,则不会出现此提示。如果既未提供选项,又未提供环境变量,则使用 Windows 身份验证模式登录。例如,若要使用集成安全性连接到 SQL Server myserver 的一个实例(如 instance1),则会使用以下内容:

:connect myserver\instance1

若要使用脚本变量连接到 myserver 的默认实例,您会使用以下内容:

:setvar myusername test

:setvar myservername myserver

:connect $(myservername) $(myusername)

[:] !!< command>

执行操作系统命令。若要执行操作系统命令,请用两个感叹号 (!!) 开始一行,后面输入操作系统命令。例如:

:!! Dir

注意:
该命令在运行 sqlcmd 的计算机上执行。

 

 

:XML [ON | OFF]

有关详细信息,请参阅本主题后面的“XML 输出格式”

:Help

列出 sqlcmd 命令以及每个命令的简短说明。

sqlcmd 文件名

可以使用 -i 选项或 :r 命令指定 sqlcmd 输入文件。可以使用 -o 选项或 :Error、:Out 和 :Perftrace 命令指定输出文件。以下是使用这些文件的一些原则:

  • :Error、:Out 和 :Perftrace 应使用不同的 <filename>。如果使用了相同的 <filename>,这些命令的输入可能会混杂在一起。
  • 如果从本地计算机的 sqlcmd 调用远程服务器上的输入文件,并且该文件包含驱动器文件路径(如 :out c:\OutputFile.txt),将在本地计算机而不是远程服务上创建输出文件。
  • 有效的文件路径包括:C:\<filename>、\\<服务器>\<共享$>\<filename> 和 "C:\Some Folder\<file name>"。如果路径中包含空格,请使用引号。
  • 每个新的 sqlcmd 会话都将覆盖现有的同名文件。

信息性消息

sqlcmd 将输出由服务器发送的所有信息性消息。在以下示例中,执行 Transact-SQL 语句后会输出信息性消息。

在命令提示符下键入以下内容:

sqlcmd

At the sqlcmd prompt type:

USE AdventureWorks;

GO

按下 Enter 时,会输出以下信息性消息:“已将数据库上下文更改为 'AdventureWorks'。”

Transact-SQL 查询的输出格式

sqlcmd 首先输出列标题,其中包含在选择列表中指定的列名。列名使用 SQLCMDCOLSEP 字符分隔。默认情况下,将使用空格。如果列名短于列宽,则使用空格填充输出,直到下一列。

此行将跟随一行分隔行,分隔行是一系列的破折号字符。以下输出显示了一个示例。

启动 sqlcmd。在 sqlcmd 命令提示符下键入以下内容:

USE AdventureWorks;

SELECT TOP (2) ContactID, FirstName, LastName

FROM Contact;

GO

按下 Enter 时,会返回以下结果集。

ContactID FirstName LastName

----------- ------------ ----------

1 Syed Abbas

2 Catherine Abel

 

(2 row(s) affected)

虽然 ContactID 列只有 4 个字符宽,但已将其扩展以适应更长的列名。默认情况下,输出会在 80 个字符处终止。可通过使用 -w 选项或设定 SQLCMDCOLWIDTH 脚本变量来进行更改。

XML 输出格式

从 FOR XML 子句得到的 XML 输出是在连续流中的未格式化的输出。

若要得到 XML 输出,请使用以下命令::XML ON

注意:
sqlcmd 将采用常见的格式返回错误消息。请注意,XML 文本流中的错误消息还将采用 XML 格式输出。如果使用 :XML ON,则 sqlcmd 不显示信息性消息。

 

 

若要关闭 XML 模式,请使用以下命令::XML OFF

发出 XML OFF 命令之前不应显示 GO 命令,因为 XML OFF 命令会将 sqlcmd 切换回面向行的输出。

XML(流形式)数据和行集数据不能混合。如果在执行输出 XML 流的 Transact-SQL 语句之前未发出 XML ON 命令,则输出将为乱码。如果已发出 XML ON 指令,则无法执行输出常规行集的 Transact-SQL 语句。

注意:
:XML 命令不支持 SET STATISTICS XML 语句。

 

 

posted on 2007-02-12 10:40  mjgforever  阅读(4643)  评论(0编辑  收藏  举报