导航

sqlcmd命令详解

Posted on 2010-05-11 12:25  FryFish  阅读(3198)  评论(0)    收藏  举报

引用自微软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 命令

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 命令必须以冒号 (:) 为前缀。
    ms162773.note(zh-cn,SQL.100).gif重要提示:
    为了保持现有 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 之前定义一个环境变量。
ms162773.note(zh-cn,SQL.100).gif注意:
-X 选项可防止将环境变量传递给 sqlcmd

 

 

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

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

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

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

:Listvar

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

ms162773.note(zh-cn,SQL.100).gif注意:
只显示由 sqlcmd 设置的脚本变量和使用 :Setvar 命令设置的脚本变量。

 

 

输出命令

 

:Error < filename >| STDERR|STDOUT

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

file name

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

STDERR

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

STDOUT

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

:Out < filename>| STDERR| STDOUT

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

:Perftrace < filename>| STDERR| STDOUT

创建所有性能跟踪信息并将它们重定向到 file name 指定的文件、stderrstdout。默认情况下,性能跟踪输出将发送到 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

ms162773.note(zh-cn,SQL.100).gif注意:
系统会相对于 sqlcmd 在其中运行的启动目录读取 <filename>

 

 

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

ms162773.note(zh-cn,SQL.100).gif注意:
每遇到一个 :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>

ms162773.note(zh-cn,SQL.100).gif注意:
该命令在运行 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>。

ms162773.note(zh-cn,SQL.100).gif注意:
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 语句。

ms162773.note(zh-cn,SQL.100).gif注意:
:XML 命令不支持 SET STATISTICS XML 语句。

 

 

sqlcmd Utility详解 - 创新远大 - 创新远大  sqlcmd 最佳方法

使用以下方法来帮助实现最高的安全性和效率。

  • 使用集成安全性。
  • 在自动化环境中使用 -X
  • 使用适当的 NTFS 文件系统权限保护输入文件和输出文件。
  • 若要提高性能,请在一个 sqlcmd 会话中执行尽可能多的操作,而不是在一系列会话中来执行这些操作。
  • 将批处理或查询执行的超时值设置为大于您所预期的值。