Invoke-Sqlcmd cmdlet

Invoke-Sqlcmd 是一个SQL Server cmdlet,它运行包含 sqlcmd 实用工具支持的语言 (Transact-SQL 和 XQuery) 和命令的语句的脚本。

使用 Invoke-Sqlcmd

Invoke-Sqlcmd cmdlet 可使你在 Windows PowerShell 环境中运行 sqlcmd 。 用 sqlcmd 执行的大部分操作也可以通过使用 Invoke-sqlcmd来完成。

下面的示例说明如何通过调用 Invoke-Sqlcmd 来执行简单查询,这与指定带有 -Q-S 选项的 sqlcmd 相似:

Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"  

下面的示例说明如何调用 Invoke-Sqlcmd、指定输入文件并将输出发送到一个文件中,这与指定带有 -i-o 选项的 sqlcmd 相似:

Invoke-Sqlcmd -InputFile "C:\MyFolder\TestSQLCmd.sql" | Out-File -FilePath "C:\MyFolder\TestSQLCmd.rpt"  

下面的示例说明如何使用 Windows PowerShell 数组来将多个 sqlcmd 脚本变量传递到 Invoke-Sqlcmd。 用于标识 SELECT 语句中 sqlcmd 脚本变量的“$”字符已经通过使用 PowerShell 反引号“`”转义符进行转义:

$MyArray = "MyVar1 = 'String1'", "MyVar2 = 'String2'"  
Invoke-Sqlcmd -Query "SELECT `$(MyVar1) AS Var1, `$(MyVar2) AS Var2;" -Variable $MyArray  

这是使用 Windows PowerShell 的 SQL Server 提供程序导航到数据库引擎实例,然后使用 Windows PowerShell Get-Item cmdlet 检索实例的 SMO Server 对象并将其传递给 Invoke-Sqlcmd 的示例:

Set-Location SQLSERVER:\SQL\MyComputer\MyInstance  
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance (Get-Item .)  

-Query 参数是位置参数,不需要命名。 如果传递到 Invoke-Sqlcmd的第一个字符串没有命名,则将其视为 -Query 参数处理。

Invoke-Sqlcmd "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"  

Invoke-Sqlcmd 中的路径上下文

如果没有使用 -Database 参数,则 Invoke-Sqlcmd 的数据库上下文由调用 cmdlet 时的活动路径设置。

路径 数据库上下文
从 SQLSERVER 以外的驱动器开始: 本地计算机上默认实例中登录 ID 的默认数据库。
SQLSERVER:\SQL 本地计算机上默认实例中登录 ID 的默认数据库。
SQLSERVER:\SQL\ComputerName 指定计算机上默认实例中登录 ID 的默认数据库。
SQLSERVER:\SQL\ComputerName\InstanceName 指定计算机上指定实例中登录 ID 的默认数据库。
SQLSERVER:\SQL\ComputerName\InstanceName\Databases 指定计算机上指定实例中登录 ID 的默认数据库。
SQLSERVER:\SQL\ComputerName\InstanceName\Databases\DatabaseName 指定计算机上指定实例中的指定数据库。 这也适用于较长的路径,例如指定数据库中的表和列节点的路径。

例如,假定在本地计算机的默认实例中,您的 Windows 帐户的默认数据库是 master。 那么,以下命令将返回 master:

Set-Location SQLSERVER:\SQL  
Invoke-Sqlcmd "SELECT DB_NAME() AS DatabaseName;"  

以下命令将返回 AdventureWorks2012

Set-Location SQLSERVER:\SQL\MyComputer\DEFAULT\Databases\AdventureWorks2012\Tables\Person.Person  
Invoke-Sqlcmd "SELECT DB_NAME() AS DatabaseName;"  

当 Invoke-Sqlcmd 使用路径数据库上下文时,它会提供一条警告。 可以使用 -SuppressProviderContextWarning 参数来关闭该警告消息。 可以使用 -IgnoreProviderContext 参数来通知 Invoke-Sqlcmd 始终使用登录帐户的默认数据库。

Invoke-Sqlcmd 和 sqlcmd 实用工具的比较

Invoke-Sqlcmd 可用来运行许多可借助于 sqlcmd 实用工具运行的脚本。 但是,用来运行 Invoke-Sqlcmd 的 Windows PowerShell 环境不同于用来运行 sqlcmd 的命令提示环境。 为了使 Invoke-Sqlcmd 在 Windows PowerShell 环境中有效,已对其行为进行了修改。

并非所有的 sqlcmd 命令都已在 Invoke-Sqlcmd中实现。 未实现的命令包括::!!:connect:error:out:ed:list:listvar:reset:perftrace:serverlist

Invoke-Sqlcmd 无法初始化 sqlcmd 环境变量或脚本变量,如 SQLCMDDBNAME 或 SQLCMDWORKSTATION。

除非指定了 Windows PowerShellInvoke-Sqlcmd 公共参数,否则 Invoke-Sqlcmd 不显示消息(如 PRINT 语句的输出)。 例如:

Invoke-Sqlcmd -Query "PRINT N'abc';" -Verbose  

并非所有的 sqlcmd 参数都需要在 PowerShell 环境中使用。 例如,Windows PowerShell 设置所有 cmdlet 输出的格式,因此,指定格式选项的 sqlcmd 参数将不能在 Invoke-Sqlcmd中实现。 下表显示了 Invoke-Sqlcmd 参数与 sqlcmd 选项之间的关系:

说明 sqlcmd 选项 Invoke-Sqlcmd 参数
服务器名称和实例名称 sqlcmd -ServerInstance
要使用的初始数据库 -d -Database
运行指定的查询并退出 -S -Query
SQL Server身份验证登录 ID。 -U -Username
SQL Server身份验证密码。 -P -Password
变量定义 -v -Variable
查询超时间隔 -t -QueryTimeout
在遇到错误时停止运行 -b -AbortOnError
专用管理员连接 -A -DedicatedAdministratorConnection
禁用交互式命令、启动脚本和环境变量 -X -DisableCommands
禁用变量替换 -X -DisableVariables
要报告的最小严重级别 -v -SeverityLevel
要报告的最小错误级别 -m -ErrorLevel
登录超时间隔 -l -ConnectionTimeout
主机名 -H -HostName
更改密码并退出 -Z -NewPassword
包含查询的输入文件 -i -InputFile
字符输出的最大长度 -w -MaxCharLength
二进制输出的最大长度 -w -MaxBinaryLength
使用 SSL 加密机制进行连接 无参数 -EncryptConnection
显示错误 无参数 -OutputSqlErrors
将消息输出到 stderr -r 无参数
使用客户端的区域设置 -R 无参数
运行指定的查询并保持运行状态 -q 无参数
要用于输出数据的代码页 -f 无参数
更改密码并保持运行状态 -Z 无参数
数据包大小 -a 无参数
列分隔符 -S 无参数
控制输出标头 -H 无参数
指定控制字符 -k 无参数
长度固定的显示宽度 -y 无参数
长度可变的显示宽度 -y 无参数
回显输入 -E 无参数
允许使用带引号的标识符 -I 无参数
删除尾随空格 -w 无参数
列出实例 -l 无参数
将输出格式化为 Unicode -U 无参数
打印统计信息 -p 无参数
结束命令 -c 无参数
使用 Windows 身份验证进行连接 -E 无参数

另请参阅

使用数据库引擎 cmdlet
sqlcmd 实用工具
使用 sqlcmd 实用工具