sqlcmd 实用工具
—— sqlserver命令行操作
摘自msdn:http://msdn.microsoft.com/zh-cn/library/ms162773.aspx
使用 sqlcmd 实用工具,可以在命令提示符处、在 SQLCMD 模式下的“查询编辑器”中、在 Windows 脚本文件中或者在 SQL Server 代理作业的操作系统 (Cmd.exe) 作业步骤中输入 Transact-SQL 语句、系统过程和脚本文件。此实用工具使用 OLE DB 执行 Transact-SQL 批处理。
重要提示 |
---|
在查询编辑器的常规模式和 SQLCMD 模式下,SQL Server Management Studio 使用 Microsoft.NET FrameworkSqlClient 执行批处理。从命令行运行 sqlcmd 时,sqlcmd 将使用 OLE DB 访问接口。由于可以应用不同的默认选项,因此在 SQL Server Management Studio SQLCMD 模式下以及在 sqlcmd 实用工具中执行相同的查询时,可能会看到不同的行为。 |
sqlcmd [{ { -U login_id [ -P password ] } | –Etrusted connection }] [ -N encrypt connection ][ -C trust the server certificate ] [ -znew password ] [ -Znew password and exit] [ -S [protocol:]server[\instance_name][,port] ] [ -Hwksta_name ] [ -ddb_name ] [ -llogintime_out ] [ -A dedicated admin connection] [ -iinput_file ] [ -ooutput_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] [ -eecho input ] [ -tquerytime_out ] [ -Ienable Quoted Identifiers ] [ -v var = "value"...] [ -xdisable variable substitution ] [ -hheaders ][ -scol_separator ] [ -wcolumn_width ] [ -Wremove trailing spaces ] [ -k [ 1 | 2 ] remove[replace] control characters ] [ -ydisplay_width ] [-Ydisplay_width ] [ -b on error batch abort] [ -Vseveritylevel ] [ -merror_level ] [ -apacket_size ][ -ccmd_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 在完成执行后退出。 |
命令环境 (Cmd.exe) 中的 sqlcmd 命令行的总长度(包括所有参数和扩展变量)取决于 Cmd.exe 所在的操作系统。
-
系统级环境变量。
-
用户级环境变量
-
运行 sqlcmd 之前在命令提示符处设置的命令 shell (SET X=Y)。
-
sqlcmd-v X=Y
-
:Setvar X Y
注意 |
---|
若要查看环境变量,请在“控制面板”中打开“系统”,然后单击“高级”选项卡。 |
变量 | 相关开关 | R/W | 默认 |
---|---|---|---|
SQLCMDUSER | -U | R | "" |
SQLCMDPASSWORD | -P | -- | "" |
SQLCMDSERVER | -S | R | "DefaultLocalInstance" |
SQLCMDWORKSTATION | -H | R | "ComputerName" |
SQLCMDDBNAME | -d | R | "" |
SQLCMDLOGINTIMEOUT | -l | R/W | "8"(秒) |
SQLCMDSTATTIMEOUT | -t | R/W | "0" = 无限期等待 |
SQLCMDHEADERS | -h | R/W | "0" |
SQLCMDCOLSEP | -s | R/W | " " |
SQLCMDCOLWIDTH | -w | R/W | "0" |
SQLCMDPACKETSIZE | -a | R | "4096" |
SQLCMDERRORLEVEL | -m | R/W | 0 |
SQLCMDMAXVARTYPEWIDTH | -y | R/W | "256" |
SQLCMDMAXFIXEDTYPEWIDTH | -Y | R/W | "0" = 无限制 |
SQLCMDEDITOR |
| R/W | "edit.com" |
SQLCMDINI |
| R | "" |
SQLCMDUSER、SQLCMDPASSWORD 和 SQLCMDSERVER 是在使用 :Connect 时
设置的。
R 表示在程序初始化过程中只能设置一次值。
R/W 表示可以使用 setvar 命令修改值,并且后续命令将受新值的影响。
除 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 语句不同,不会放在执行缓冲区中。
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 AdventureWorks2008R2;
GO
按下 Enter 时,会输出以下信息性消息:“已将数据库上下文改为 'AdventureWorks2008R2'。”
Transact-SQL 查询的输出格式
sqlcmd 首先输出列标题,其中包含在选择列表中指定的列名。列名使用 SQLCMDCOLSEP 字符分隔。默认情况下,将使用空格。如果列名短于列宽,则使用空格填充输出,直到下一列。
此行将跟随一行分隔行,分隔行是一系列的破折号字符。以下输出显示了一个示例。
启动 sqlcmd。在 sqlcmd 命令提示符下键入以下内容:
USE AdventureWorks2008R2;
SELECT TOP (2) BusinessEntityID, FirstName, LastName
FROM Person.Person;
GO
按下 Enter 时,会返回以下结果集。
BusinessEntityID FirstName LastName
---------------- ------------ ----------
285 Syed Abbas
293 Catherine Abel
(2 row(s) affected)
虽然 BusinessEntityID 列只有 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 语句。 |
使用以下方法来帮助实现最高的安全性和效率。
-
使用集成安全性。
-
在自动化环境中使用 -X。
-
使用适当的 NTFS 文件系统权限保护输入文件和输出文件。
-
若要提高性能,请在一个 sqlcmd 会话中执行尽可能多的操作,而不是在一系列会话中来执行这些操作。
-
将批处理或查询执行的超时值设置为大于您所预期的值。
转载于:https://blog.51cto.com/juneboy/724112