2.sqlcmd -U 用户名 -P 密码 -S 域名 -d 数据库名称
使用 sqlcmd 运行 Transact-SQL 脚本文件
可以使用 sqlcmd 执行数据库脚本文件。 脚本文件是一些文本文件,它们同时包含 Transact-SQL 语句、sqlcmd 命令和脚本变量。 有关如何使用脚本变量的详细信息,请参阅将 sqlcmd 与脚本变量结合使用。 sqlcmd 与脚本文件中语句、命令和脚本变量的配合方式类似于它与交互输入的语句和命令的配合方式。 主要区别在于 sqlcmd 从输入文件连续读取内容,而不是等待用户输入语句、命令和脚本变量。
可以通过几种不同的方式创建数据库脚本文件:
-
可以在 SQL Server Management Studio 中以交互方式生成和调试一组 Transact-SQL 语句,然后将“查询”窗口中的内容另存为脚本文件。
-
可以使用记事本等文本编辑器创建包含 Transact-SQL 语句的文本文件。
A.使用 sqlcmd 运行脚本
启动记事本并键入以下 Transact-SQL 语句:
USE AdventureWorks2012;
GO
SELECT TOP (3) BusinessEntityID, FirstName, LastName
FROM Person.Person;
GO
创建一个名为 MyFolder 的文件夹,然后将脚本另存为文件夹 C:\MyFolder 中的文件 MyScript.sql。 在命令提示符处输入以下命令运行脚本,并将输出放入 MyFolder 的 MyOutput.txt 中:
sqlcmd -i C:\MyFolder\MyScript.sql -o C:\MyFolder\MyOutput.txt
在记事本中查看 MyOutput.txt 的内容时,将看到以下内容:
Changed database context to 'AdventureWorks2012'.
BusinessEntityID FirstName LastName
---------------- ----------- -----------
1 Syed Abbas
2 Catherine Abel
3 Kim Abercrombie
(3 rows affected)
B.通过专用管理连接使用 sqlcmd
在下面的示例中,sqlcmd 通过专用管理员连接 (DAC) 连接到一台具有阻塞问题的服务器。
C:\>sqlcmd -S ServerName -A
1> SELECT blocked FROM sys.dm_exec_requests WHERE blocked <> 0;
2> GO
下面是结果集:
spid blocked
------ -------
62 64
(1 rows affected)
使用 sqlcmd 结束阻塞进程。
1> KILL 64;
2> GO
C.使用 sqlcmd 执行存储过程
下面的示例说明如何使用 sqlcmd 执行存储过程。 创建以下存储过程。
USE AdventureWorks2012;
IF OBJECT_ID ( ' dbo.ContactEmailAddress, 'P' ) IS NOT NULL
DROP PROCEDURE dbo.ContactEmailAddress;
GO
CREATE PROCEDURE dbo.ContactEmailAddress
(
@FirstName nvarchar(50)
,@LastName nvarchar(50)
)
AS
SET NOCOUNT ON
SELECT EmailAddress
FROM Person.Person
WHERE FirstName = @FirstName
AND LastName = @LastName;
SET NOCOUNT OFF
在 sqlcmd 提示符下,输入以下内容:
C:\sqlcmd
1> :Setvar FirstName Gustavo
1> :Setvar LastName Achong
1> EXEC dbo.ContactEmailAddress $(Gustavo),$(Achong)
2> GO
EmailAddress
-----------------------------
gustavo0@adventure-works.com
D.使用 sqlcmd 进行数据库维护
下面的示例说明了如何将 sqlcmd 用于数据库维护任务。 使用以下代码创建 C:\BackupTemplate.sql。
USE master;
BACKUP DATABASE [$(db)] TO DISK='$(bakfile)';
在 sqlcmd 提示符下,输入以下内容:
C:\ >sqlcmd
1> :connect <server>
Sqlcmd: Successfully connected to server <server>.
1> :setvar db msdb
1> :setvar bakfile c:\msdb.bak
1> :r c:\BackupTemplate.sql
2> GO
Changed database context to 'master'.
Processed 688 pages for database 'msdb', file 'MSDBData' on file 2.
Processed 5 pages for database 'msdb', file 'MSDBLog' on file 2.
BACKUP DATABASE successfully processed 693 pages in 0.725 seconds (7.830 MB/sec)
E.使用 sqlcmd 对多个实例执行代码
某文件中的以下代码表示一个连接到两个实例的脚本。 请注意连接到第二个实例之前的 GO。
:CONNECT <server>\,<instance1>
EXEC dbo.SomeProcedure
GO
:CONNECT <server>\,<instance2>
EXEC dbo.SomeProcedure
GO
E.返回 XML 输出
下面的示例说明了如何以连续流返回未格式化的 XML 输出。
C:\>sqlcmd -d AdventureWorks2012
1> :XML ON
1> SELECT TOP 3 FirstName + ' ' + LastName + ', '
2> FROM Person.Person
3> GO
Syed Abbas, Catherine Abel, Kim Abercrombie,
F.在 Windows 脚本文件中使用 sqlcmd
在 .bat 文件中,sqlcmd命令(如 sqlcmd -i C:\InputFile.txt -o C:\OutputFile.txt, )可以与 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
-
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
然后,在命令提示符处运行 C:\windowsscript.bat:
C:\>windowsscript.bat
Running badscript.sql
== An error occurred
Running goodscript.sql
Running returnvalue.sql
SQLCMD returned 100 to the command shell
G.使用 sqlcmd 在 Windows Azure SQL Database 上设置加密
可对于与 SQL Database 数据的连接执行 sqlcmd以指定加密和证书信任。 有两个 sqlcmd 选项可供选择:
-
-N 开关,客户端使用它来请求加密连接。 此选项等同于 ADO. net 选项 ENCRYPT = true。
-
–C 开关,客户端用来将其配置为隐式信任服务器证书且不对其进行验证。 此选项等同于 ADO. net 选项 TRUSTSERVERCERTIFICATE = true。
SQL Database服务并不支持 SQL Server 实例上所有可用的 SET 选项。 当将相应的 SET 选项设置为 ON 或 OFF 时,下面的选项将引发错误:
-
SET ANSI_DEFAULTS
-
SET ANSI_NULLS
-
SET REMOTE_PROC_TRANSACTIONS
-
SET ANSI_NULL_DEFAULT
下面的 SET 选项虽然不会引发异常,但无法使用。 不推荐使用这些选项:
-
SET CONCAT_NULL_YIELDS_NULL
-
SET ANSI_PADDING
-
SET QUERY_GOVERNOR_COST_LIMIT
语法
以下示例介绍了 SQL Server Native Client 访问接口设置包括的情况:ForceProtocolEncryption = False、Trust Server Certificate = No
使用 Windows 凭据进行连接并对通信加密:
SQLCMD –E –N
使用 Windows 凭据进行连接并信任服务器证书:
SQLCMD –E –C
使用 Windows 凭据进行连接、对通信加密并信任服务器证书:
SQLCMD –E –N –C
以下示例介绍了 SQL Server Native Client 访问接口设置包括的情况:ForceProtocolEncryption = True、TrustServerCertificate = Yes。
使用 Windows 凭据进行连接、对通信加密并信任服务器证书:
SQLCMD –E
使用 Windows 凭据进行连接、对通信加密并信任服务器证书:
SQLCMD –E –N
使用 Windows 凭据进行连接、对通信加密并信任服务器证书:
SQLCMD –E –T
使用 Windows 凭据进行连接、对通信加密并信任服务器证书:
SQLCMD –E –N –C
如果访问接口指定了 ForceProtocolEncryption = True,则启用加密,即使连接字符串中具有 Encrypt=No。
FROM:http://technet.microsoft.com/zh-cn/library/ms180944.aspx