引用自微软MSDN:http://msdn.microsoft.com/zh-cn/library/ms162773.aspx
一、输入参数
sqlcmd [{ { -U login_id [ -P password ] } | –E trusted connection }] [ -z new password ] [ -Z new password and exit] [ -S server_name [ \ instance_name ] ] [ -H wksta_name ] [ -d db_name ] [ -l login time_out ] [ -A dedicated admin connection ] [ -i input_file ] [ -o output_file ] [ -f < codepage > | i: < codepage > [ < , o: < codepage > ] ] [ -u unicode output ] [ -r [ 0 | 1 ] msgs to stderr ] [ -R use client regional settings ] [ -q "cmdline query" ] [ -Q "cmdline query" and exit ] [ -e echo input ] [ -t query time_out ] [ -I enable Quoted Identifiers ] [ -v var = "value"...] [ -x disable variable substitution ] [ -h headers ][ -s col_separator ] [ -w column_width ] [ -W remove trailing spaces ] [ -k [ 1 | 2 ] remove[replace] control characters ] [ -y display_width ] [-Y display_width ] [ -b on error batch abort ] [ -V severitylevel ] [ -m error_level ] [ -a packet_size ][ -c cmd_end ] [ -L [ c ] list servers[clean output] ] [ -p [ 1 ] print statistics[colon format]] [ -X [ 1 ] ] disable commands, startup script, enviroment variables [and exit] [ -? show syntax summary ]
[注释]:
不必按语法部分所示的顺序使用选项。
在返回多个结果时,sqlcmd 在批处理中的每个结果集之间输出一个空行。此外,如果没有应用于已执行的语句,则“<x> 行受影响”消息不会出现。
若要交互使用 sqlcmd,请在命令提示符处使用本主题前面介绍的一个或多个选项键入 sqlcmd。有关详细信息,请参阅使用 sqlcmd 实用工具。
注意: |
---|
-L、-Q、-Z 或 -i 选项会导致 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 记事本,请在命令提示符处键入:
DE>SET SQLCMDEDITOR=notepadDE>
- [:] RESET
-
清除语句缓存。
- :List
-
输出语句缓存的内容。
- 变量
- :Setvar <var> [ "value" ]
-
定义 sqlcmd 脚本变量。脚本变量具有如下格式:DE>$(VARNAME)DE>。
变量名称不区分大小写。
可以通过下列方式设置脚本变量:
- 隐式使用命令行选项。例如,-l 选项设置 SQLCMDLOGINTIMEOUT sqlcmd 变量。
- 显式使用 :Setvar 命令。
- 在运行 sqlcmd 之前定义一个环境变量。
注意: -X 选项可防止将环境变量传递给 sqlcmd。 如果使用 :Setvar 定义的变量和某个环境变量同名,则使用 :Setvar 定义的变量优先。
变量名中不能包含空格字符。
变量名不能与变量表达式(如 $(var))具有相同的形式。
如果脚本变量的字符串值中含有空格,请用引号将该值引起来。如果未指定脚本变量的值,则将删除该脚本变量。
- 隐式使用命令行选项。例如,-l 选项设置 SQLCMDLOGINTIMEOUT sqlcmd 变量。
- :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 200x 传递整个 4 字节整数。语法为:
DE>:EXIT(query)DE>
例如:
DE>:EXIT(SELECT @@ROWCOUNT)DE>
您还可以在批处理文件中包含 EXIT 参数。例如,在命令提示符处键入:
DE>sqlcmd -Q "EXIT(SELECT COUNT(*) FROM '%1')"DE>
sqlcmd 实用工具将圆括号 ( ) 中的所有内容发送给服务器。如果系统存储过程选择了一个集合并返回一个值,则仅返回选择的内容。如果圆括号中没有任何内容,则 EXIT ( ) 语句会执行批处理中此语句前的所有内容,然后退出,且不返回任何值。
当指定了错误查询时,sqlcmd 将退出,且不返回任何值。
下面是 EXIT 格式的列表:
- :EXIT
不执行批处理就立即退出,无返回值。
- :EXIT( )
执行批处理后退出,不返回值。
- :EXIT(query)
执行包括查询的批处理,返回查询的结果后退出。
如果在 sqlcmd 脚本中使用 RAISERROR,并且出现状态 127,则 sqlcmd 将退出,并将消息 ID 返回给客户端。例如:
DE>RAISERROR(50001, 10, 127)DE>
该错误会导致 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 DE>myserverDE> 的一个实例(如 DE>instance1DE>),则会使用以下内容:
DE>:connect myserver\instance1DE>
若要使用脚本变量连接到 DE>myserverDE> 的默认实例,您会使用以下内容:
DE>:setvar myusername testDE>
DE>:setvar myservername myserverDE>
DE>:connect $(myservername) $(myusername)DE>
- [:] !!< command>
-
执行操作系统命令。若要执行操作系统命令,请用两个感叹号 (!!) 开始一行,后面输入操作系统命令。例如:
DE>:!! DirDE>
注意: 该命令在运行 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 语句后会输出信息性消息。
在命令提示符下键入以下内容:
DE>sqlcmdDE>
DE>At the sqlcmd prompt type:DE>
DE>USE AdventureWorks;DE>
DE>GODE>
按下 Enter 时,会输出以下信息性消息:“已将数据库上下文改为 'AdventureWorks'。”
Transact-SQL 查询的输出格式
sqlcmd 首先输出列标题,其中包含在选择列表中指定的列名。列名使用 SQLCMDCOLSEP 字符分隔。默认情况下,将使用空格。如果列名短于列宽,则使用空格填充输出,直到下一列。
此行将跟随一行分隔行,分隔行是一系列的破折号字符。以下输出显示了一个示例。
启动 sqlcmd。在 sqlcmd 命令提示符下键入以下内容:
DE>USE AdventureWorks;DE>
DE>SELECT TOP (2) ContactID, FirstName, LastName DE>
DE>FROM Person.Contact;DE>
DE>GO DE>
按下 Enter 时,会返回以下结果集。
DE>ContactID FirstName LastName DE>
DE>----------- ------------ ----------DE>
DE>1 Syed AbbasDE>
DE>2 Catherine AbelDE>
DE>(2 row(s) affected)DE>
虽然 DE>ContactIDDE> 列只有 4 个字符宽,但已将其扩展以适应更长的列名。默认情况下,输出会在 80 个字符处终止。可通过使用 -w 选项或设定 SQLCMDCOLWIDTH 脚本变量来进行更改。
XML 输出格式
从 FOR XML 子句得到的 XML 输出是在连续流中的未格式化的输出。
若要得到 XML 输出,请使用以下命令:DE>:XML ONDE>。
注意: |
---|
sqlcmd 将采用常见的格式返回错误消息。请注意,XML 文本流中的错误消息还将采用 XML 格式输出。如果使用 DE>:XML ONDE>,则 sqlcmd 不显示信息性消息。 |
若要关闭 XML 模式,请使用以下命令:DE>:XML OFFDE>。
发出 XML OFF 命令之前不应显示 GO 命令,因为 XML OFF 命令会将 sqlcmd 切换回面向行的输出。
XML(流形式)数据和行集数据不能混合。如果在执行输出 XML 流的 Transact-SQL 语句之前未发出 XML ON 命令,则输出将为乱码。如果已发出 XML ON 指令,则无法执行输出常规行集的 Transact-SQL 语句。
注意: |
---|
:XML 命令不支持 SET STATISTICS XML 语句。 |
使用以下方法来帮助实现最高的安全性和效率。
- 使用集成安全性。
- 在自动化环境中使用 -X。
- 使用适当的 NTFS 文件系统权限保护输入文件和输出文件。
- 若要提高性能,请在一个 sqlcmd 会话中执行尽可能多的操作,而不是在一系列会话中来执行这些操作。
- 将批处理或查询执行的超时值设置为大于您所预期的值。