引用自微软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 命令必须以冒号 (:) 为前缀。
重要提示: |
---|
为了保持现有 osql 脚本的向后兼容性,有些命令会被视为不带冒号。这由 [:] 指示。 |
sqlcmd 命令只有出现在一行的开头时,才能够被识别。
所有 sqlcmd 命令都不区分大小写。
每个命令都必须位于单独的行中。命令后面不能跟随 Transact-SQL 语句或其他命令。
命令将被立即执行。它们与 Transact-SQL 语句不同,不会放在执行缓冲区中。
[:] ED 启动文本编辑器。该编辑器可以用来编辑当前的 Transact-SQL 批处理或上次执行的批处理。若要编辑上次执行的批处理,必须在上一批处理执行完之后立即键入 ED 命令。 文本编辑器由 SQLCMDEDITOR 环境变量定义。默认编辑器为“Edit”。若要更改编辑器,请设置 SQLCMDEDITOR 环境变量。例如,若要将编辑器设置为 Microsoft 记事本,请在命令提示符处键入: DE>SET SQLCMDEDITOR=notepadDE>
:Setvar <var> [ 'value' ] 定义 sqlcmd 脚本变量。脚本变量具有如下格式:DE>$(VARNAME)DE>。 变量名称不区分大小写。 可以通过下列方式设置脚本变量: 注意: |
---|
-X 选项可防止将环境变量传递给 sqlcmd。 |
如果使用 :Setvar 定义的变量和某个环境变量同名,则使用 :Setvar 定义的变量优先。 变量名中不能包含空格字符。 变量名不能与变量表达式(如 $(var))具有相同的形式。 如果脚本变量的字符串值中含有空格,请用引号将该值引起来。如果未指定脚本变量的值,则将删除该脚本变量。
:Listvar 显示当前设置的脚本变量列表。 注意: |
---|
只显示由 sqlcmd 设置的脚本变量和使用 :Setvar 命令设置的脚本变量。 |
:On Error[ exit | ignore] 设置在脚本或批处理执行过程中发生错误时要执行的操作。 使用 exit 选项时,sqlcmd 退出,并显示相应的错误值。 使用 ignore 选项时,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 格式的列表: 不执行批处理就立即退出,无返回值。 执行批处理后退出,不返回值。 执行包括查询的批处理,返回查询的结果后退出。 如果在 sqlcmd 脚本中使用 RAISERROR,并且出现状态 127,则 sqlcmd 将退出,并将消息 ID 返回给客户端。例如: DE>RAISERROR(50001, 10, 127)DE> 该错误会导致 sqlcmd 脚本终止并将消息 ID 50001 返回给客户端。 SQL Server 保留了介于 -1 到 -99 之间的返回值;sqlcmd 定义了以下附加返回值: 返回值 | 说明 |
---|
-100 | 选择返回值前遇到错误。 | -101 | 选择返回值时找不到行。 | -102 | 选择返回值时发生转换错误。 |
:r < filename> 将来自通过 <filename>所指定文件的其他 Transact-SQL 语句和 sqlcmd 命令分析到语句缓存中。 如果文件包含的 Transact-SQL 语句后面没有跟随 GO,则必须在 :r 的后一行中输入 GO。 注意: |
---|
系统会相对于 sqlcmd 在其中运行的启动目录读取 <filename>。 |
当遇到批处理终止符之后,将读取并执行该文件。可以发出多个 :r 命令。该文件可以包含任何 sqlcmd 命令。包括批处理终止符 GO。 注意: |
---|
每遇到一个 :r 命令,交互模式下显示的行计数都会加一。:r 命令会出现在 list 命令的输出中。 |
:Connect server_name[\instance_name] [-l timeout] [-U user_name [-P password]] 连接到 SQL Server 的一个实例。同时关闭当前的连接。 超时选项: 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>
: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 语句。 |
 sqlcmd 最佳方法 使用以下方法来帮助实现最高的安全性和效率。 使用集成安全性。
在自动化环境中使用 -X。
使用适当的 NTFS 文件系统权限保护输入文件和输出文件。
若要提高性能,请在一个 sqlcmd 会话中执行尽可能多的操作,而不是在一系列会话中来执行这些操作。
将批处理或查询执行的超时值设置为大于您所预期的值。
|