sqlcmd 实用工具是一个 Microsoft Win32 命令提示实用工具,用于 Transact-SQL 语句和脚本的即席、交互执行以及 Transact-SQL 脚本撰写任务的自动化。若要以交互方式使用 sqlcmd,或要生成可使用 sqlcmd 运行的脚本文件,用户需要了解 Transact-SQL。通常以下列方式使用 sqlcmd 实用工具:
- 用户以交互方式输入 Transact-SQL 语句,输入方式与在命令提示符下输入的方式类似。结果将显示在命令提示符处。若要打开命令提示符窗口,依次单击“开始”、“所有程序”,指向“附件”,然后单击“命令提示符”。在命令提示符处,键入 sqlcmd,后面跟随所需的一系列选项。有关 sqlcmd 支持的选项的完整列表,请参阅sqlcmd 实用工具。
- 用户通过下列方式提交 sqlcmd 作业:指定要执行的单个 Transact-SQL 语句,或将实用工具指向要执行的 Transact-SQL 语句所在的文本文件。输出通常定向到一个文本文件,但也可以显示在命令提示符处。
- SQL Server Management Studio 查询编辑器中的 SQLCMD 模式。
- SQL Server 管理对象 (SMO)
- SQL Server 代理 CmdExec 作业。
最常用的选项如下:
- 服务器选项(-S),用于标识 sqlcmd 连接到的 Microsoft SQL Server 实例。
- 身份验证选项(-E、-U 和 -P),用于指定 sqlcmd 连接到 SQL Server 实例所使用的凭据。
注意: -E 选项为默认选项,毋须指定。 - 输入选项(-Q、-q 和 -i),用于标识 sqlcmd 输入的位置。
- 输出选项(-o),用于指定 sqlcmd 输出所在的文件。
以下是 sqlcmd 实用工具的常见用法:
- 使用 Windows 身份验证连接到默认实例,以交互方式运行 Transact-SQL 语句:
sqlcmd -S <ComputerName>
注意: 上述示例中,未指定 -E,因为它是默认选项,而且 sqlcmd 使用 Windows 身份验证连接到默认实例。 - 使用 Windows 身份验证连接到命名实例,以交互方式运行 Transact-SQL 语句:
sqlcmd -S <ComputerName>\<InstanceName>
sqlcmd -S .\<InstanceName>
- 使用 Windows 身份验证连接到命名实例,并指定输入和输出文件:
sqlcmd -S <ComputerName>\<InstanceName> -i <MyScript.sql> -o <MyOutput.rpt>
- 使用 Windows 身份验证连接到本地计算机上的默认实例,执行查询,并在查询运行完毕后使 sqlcmd 保持运行状态:
sqlcmd -q "SELECT * FROM AdventureWorks.Person.Contact"
- 使用 Windows 身份验证连接到本地计算机上的默认实例,执行查询,将输出定向到某个文件,并在查询运行完毕后使 sqlcmd 退出:
sqlcmd -Q "SELECT * FROM AdventureWorks.Person.Contact" -o MyOutput.txt
- 使用 SQL Server 身份验证连接到命名实例,以交互方式运行 Transact-SQL 语句,并由 sqlcmd 提示输入密码:
sqlcmd -U MyLogin -S <ComputerName>\<InstanceName>
注意: 若要查看 sqlcmd 实用工具所支持选项的列表,请运行:DE>sqlcmd -?DE>。
您可以使用 sqlcmd 实用工具以交互方式在命令提示符窗口中执行 Transact-SQL 语句。若要使用 sqlcmd 以交互方式执行 Transact-SQL 语句,请在未使用 -Q、-q、-Z 或 -i 选项指定任何输入文件或查询的情况下运行实用工具。例如:
DE>sqlcmd -S <ComputerName>\<InstanceName>DE>
在未指定输入文件或查询的情况下执行命令时,sqlcmd 连接到 SQL Server 的指定实例,然后显示一个新行,其中包含 DE>1>DE> 并且后面跟着一个闪烁的下划线(称为 sqlcmd 提示符)。DE>1DE> 表示这是 Transact-SQL 语句的第一行,而 sqlcmd 提示符则是您键入 Transact-SQL 语句的起点。
在 sqlcmd 提示符中,可以键入 Transact-SQL 语句和 sqlcmd 命令,如 GO 和 EXIT。每个 Transact-SQL 语句放在称为“语句缓存”的缓冲区中。键入 GO 命令并按 Enter 键后,这些语句将发送到 SQL Server。若要退出 sqlcmd,请在新行开始处键入 EXIT 或 QUIT。
若要清除语句缓存,请键入 :RESET。键入 ^C 将使 sqlcmd 退出。在发出 GO 命令后,还可以用 ^C 停止语句缓存的执行。
通过在 sqlcmd 提示符中输入 :ED 命令,可以编辑交互式会话中输入的 Transact-SQL 语句。编辑器将打开,编辑 Transact-SQL 语句并关闭编辑器后,修改后的 Transact-SQL 语句将显示于命令窗口中。输入 GO以运行修改后的 Transact-SQL 语句。
用引号引起来的字符无需任何额外的预处理即可使用。例外,输入两个连续的引号可以将引号插入字符串中,SQL Server 将这种字符序列视作一个引号。(但在服务器上会进行转换。)当脚本变量出现在字符串中时,不会展开它们。
例如:
DE>sqlcmdDE>
DE>PRINT "Length: 5"" 7'"DE>
DE>GODE>
下面是结果集:
DE>Length: 5" 7' DE>
sqlcmd 支持包含跨多行的字符串的脚本。例如,下面的 DE>SELECTDE> 语句跨多行,但键入 DE>GODE> 并按 Enter 键后,将执行单个字符串。
DE>SELECT First lineDE>
DE>FROM Second lineDE>
DE>WHERE Third lineDE>
DE>GODE>
本示例说明了以交互方式运行 sqlcmd 的过程。
打开命令提示符窗口时,出现如下一行内容:
DE>C:\> _DE>
这表示文件夹 DE>C:\DE> 为当前文件夹,如果您指定文件名,则 Windows 将在此文件夹中查找这个文件。
键入 sqlcmd 连接到本地计算机上的 SQL Server 默认实例,命令提示符窗口的内容为:
DE>C:\>sqlcmdDE>
DE>1> _DE>
这表示您已连接到 SQL Server 的实例,并且 DE>sqlcmdDE> 现在已可以接受 Transact-SQL 语句和 DE>sqlcmdDE> 命令。DE>1>DE> 后闪烁的下划线是 DE>sqlcmdDE> 提示符,它标明了所键入语句和命令的显示位置。现在,键入 USE AdventureWorks 并按 Enter 键,然后键入 GO 并按 Enter 键。命令提示符窗口的内容如下:
DE>sqlcmdDE>
DE>USE AdventureWorks;DE>
DE>GODE>
下面是结果集:
DE>Changed database context to 'AdventureWorks'.DE>
DE>1> _DE>
输入 DE>USE AdventureWorksDE> 后按 Enter 键,即向 DE>sqlcmdDE> 发出换行信号。键入 DE>GO,DE> 后按 Enter 键,即向 DE>sqlcmdDE> 发出信号将 DE>USE AdventureWorksDE> 语句发送到 SQL Server 的实例。DE>sqlcmdDE> 随后返回一条消息,指示 DE>USEDE> 语句已成功完成并显示新的 DE>1>DE> 提示符作为输入新语句或命令的信号。
下面的示例说明了键入 DE>SELECTDE> 语句和 DE>GODE> 执行 DE>SELECTDE> 以及键入 DE>EXITDE> 退出 DE>sqlcmdDE> 时命令提示符窗口包含的内容:
DE>sqlcmd DE>
DE>USE AdventureWorks;DE>
DE>GODE>
DE>SELECT TOP (5) ContactID, FirstName, LastNameDE>
DE>FROM Person.Contact;DE>
DE>GODE>
下面是结果集:
DE>ContactID FirstName LastNameDE>
DE>----------- -------------------------------------------------- -----------DE>
DE>1 Syed AbbasDE>
DE>2 Catherine AbelDE>
DE>3 Kim AbercrombieDE>
DE>4 Humberto AcevedoDE>
DE>5 Pilar AckermanDE>
DE>(5 rows affected)DE>
DE>1> EXITDE>
DE>C:\>DE>
行 DE>3> GODE> 后的几行内容为 DE>SELECTDE> 语句的输出。生成输出后,DE>sqlcmdDE> 重置 DE>sqlcmdDE> 提示符并显示 DE>1>DE>。在 DE>1>DE> 行输入 DE>EXITDE> 后,命令提示符窗口显示第一次打开时显示的行。它指示 DE>sqlcmdDE> 已退出会话。现在可以再键入一个 DE>EXITDE> 命令关闭命令提示符窗口。
可以使用 sqlcmd 执行数据库脚本文件。脚本文件是一些文本文件,它们同时包含 Transact-SQL 语句、sqlcmd 命令和脚本变量。有关如何使用脚本变量的详细信息,请参阅将 sqlcmd 与脚本变量结合使用。sqlcmd 与脚本文件中语句、命令和脚本变量的配合方式类似于它与交互输入的语句和命令的配合方式。主要区别在于 sqlcmd 从输入文件连续读取内容,而不是等待用户输入语句、命令和脚本变量。
可以通过几种不同的方式创建数据库脚本文件:
- 可以在 SQL Server Management Studio 中以交互方式生成和调试一组 Transact-SQL 语句,然后将“查询”窗口中的内容另存为脚本文件。
- 可以使用记事本等文本编辑器创建包含 Transact-SQL 语句的文本文件。
A. 使用 sqlcmd 运行脚本
启动记事本并键入以下 Transact-SQL 语句:
DE>USE AdventureWorks;DE>
DE>GODE>
DE>SELECT TOP (5) ContactID, FirstName, LastNameDE>
DE>FROM Person.Contact;DE>
DE>GODE>
创建一个名为 DE>MyFolderDE> 的文件夹,然后将脚本另存为文件夹 DE>C:\MyFolderDE> 中的文件 DE>MyScript.sqlDE>。在命令提示符处输入以下命令运行脚本,并将输出放入 DE>MyFolderDE> 的 DE>MyOutput.txtDE> 中:
DE>sqlcmd -i C:\MyFolder\MyScript.sql -o C:\MyFolder\MyOutput.txtDE>
在记事本中查看 DE>MyOutput.txtDE> 的内容时,将看到以下内容:
DE>Changed database context to 'AdventureWorks'.DE>
DE>ContactID FirstName LastNameDE>
DE>----------- ----------- -----------DE>
DE>1 Syed Abbas DE>
DE>2 Catherine Abel DE>
DE>3 Kim Abercrombie DE>
DE>4 Humberto Acevedo DE>
DE>5 Pilar Ackerman DE>
DE>(5 rows affected)DE>
B. 通过专用管理连接使用 sqlcmd
在下面的示例中,DE>sqlcmdDE> 通过专用管理员连接 (DAC) 连接到一台具有阻塞问题的服务器。
DE>C:\>sqlcmd -S ServerName -ADE>
DE>1> SELECT blocked FROM sys.dm_exec_requests WHERE blocked <> 0;DE>
DE>2> GODE>
下面是结果集:
DE>spid blockedDE>
DE>------ -------DE>
DE>62 64DE>
DE>(1 rows affected)DE>
使用 DE>sqlcmdDE> 结束阻塞进程。
DE>1> KILL 64;DE>
DE>2> GODE>
C. 使用 sqlcmd 执行存储过程
下面的示例说明如何使用 DE>sqlcmdDE> 执行存储过程。创建以下存储过程。
DE>USE AdventureWorks;DE>
DE>IF OBJECT_ID ( ' dbo.ContactEmailAddress, 'P' ) IS NOT NULL DE>
DE>DROP PROCEDURE dbo.ContactEmailAddress;DE>
DE>GODE>
DE>CREATE PROCEDURE dbo.ContactEmailAddressDE>
DE>(DE>
DE>@FirstName nvarchar(50)DE>
DE>,@LastName nvarchar(50)DE>
DE>)DE>
DE>ASDE>
DE>SET NOCOUNT ONDE>
DE>SELECT EmailAddress DE>
DE>FROM Person.Contact DE>
DE>WHERE FirstName = @FirstNameDE>
DE>AND LastName = @LastName;DE>
DE>SET NOCOUNT OFFDE>
在 DE>sqlcmdDE> 提示符下,输入以下内容:
DE>C:\sqlcmdDE>
DE>1> :Setvar FirstName GustavoDE>
DE>1> :Setvar LastName AchongDE>
DE>1> EXEC dbo.ContactEmailAddress $(Gustavo),$(Achong)DE>
DE>2> GODE>
DE>EmailAddressDE>
DE>-----------------------------DE>
DE>gustavo0@adventure-works.comDE>
D. 使用 sqlcmd 进行数据库维护
下面的示例说明了如何将 DE>sqlcmdDE> 用于数据库维护任务。使用以下代码创建 DE>C:\BackupTemplate.sqlDE>。
DE>USE master;DE>
DE>BACKUP DATABASE [$(db)] TO DISK='$(bakfile)';DE>
在 DE>sqlcmdDE> 提示符下,输入以下内容:
DE>C:\ >sqlcmdDE>
DE>1> :connect <server>DE>
DE>Sqlcmd: Successfully connected to server <server>.DE>
DE>1> :setvar db msdbDE>
DE>1> :setvar bakfile c:\msdb.bakDE>
DE>1> :r c:\BackupTemplate.sqlDE>
DE>2> GODE>
DE>Changed database context to 'master'.DE>
DE>Processed 688 pages for database 'msdb', file 'MSDBData' on file 2.DE>
DE>Processed 5 pages for database 'msdb', file 'MSDBLog' on file 2.DE>
DE>BACKUP DATABASE successfully processed 693 pages in 0.725 seconds (7.830 MB/sec)DE>
E. 使用 sqlcmd 对多个实例执行代码
某文件中的以下代码表示一个连接到两个实例的脚本。请注意连接到第二个实例之前的 DE>GODE>。
DE>:CONNECT <server>\,<instance1>DE>
DE>EXEC dbo.SomeProcedureDE>
DE>GODE>
DE>:CONNECT <server>\,<instance2>DE>
DE>EXEC dbo.SomeProcedureDE>
DE>GODE>
E. 返回 XML 输出
下面的示例说明了如何以连续流返回未格式化的 XML 输出。
DE>C:\>sqlcmd -d AdventureWorksDE>
DE>1> :XML ONDE>
DE>1> SELECT TOP 4 FirstName + ' ' + LastName + ', 'DE>
DE>2> FROM Person.ContactDE>
DE>3> GODE>
DE>Gustavo Achong, Catherine Abel, Kim Abercrombie, Humberto Acevedo, DE>
F. 在 Windows 脚本文件中使用 sqlcmd
在 .bat 文件中,sqlcmdDE>DE> 命令(如 DE>sqlcmd -i C:\InputFile.txt -o C:\OutputFile.txt, DE>)可以与 VBScript 一起执行。此时,不要使用交互选项。执行 .bat 文件的计算机上必须安装 sqlcmd。
首先,创建以下四个文件:
- C:\badscript.sql
SELECT batch_1_this_is_an_error GO SELECT 'batch #2' GO
- C:\goodscript.sql
SELECT 'batch #1' GO SELECT 'batch #2' GO
- C:\returnvalue.sql
:exit(select 100) @echo off C:\windowsscript.bat @echo off echo Running badscript.sql sqlcmd -i badscript.sql -b -o out.log if not errorlevel 1 goto next1 echo == An error occurred :next1 echo Running goodscript.sql sqlcmd -i goodscript.sql -b -o out.log if not errorlevel 1 goto next2 echo == An error occurred :next2 echo Running returnvalue.sql sqlcmd -i returnvalue.sql -o out.log echo SQLCMD returned %errorlevel% to the command shell :exit
然后,在命令提示符处运行 DE>C:\windowsscript.batDE>:
DE>C:\>windowsscript.batDE>
DE>Running badscript.sqlDE>
DE>== An error occurredDE>
DE>Running goodscript.sqlDE>
DE>Running returnvalue.sqlDE>
DE>SQLCMD returned 100 to the command shellDE>
引用自微软MSDN:http://msdn.microsoft.com/zh-cn/library/ms180944.aspx