PowerShell的Invoke-Sqlcmd可用于运行不返回任何数据集的脚本吗?

时间:2016-08-09 14:16:07

标签: sql-server powershell

我有一个包含多个CREATE PROCEDURE语句的脚本(文件)。创建Proc语句必须作为单独的批处理提交,因此它们都在GO语句的文件中分隔(每个“GO”都在它自己的行上)。运行时,第一个批处理(第一个GO语句之前的所有文本)成功运行,但PowerShell返回错误Object reference not set to an instance of an object,并且不会运行该一个文件中的后续批处理。

我已经向脚本添加了返回数据集的批次。在脚本开始时,它们返回结果并且无错误地运行,然后PowerShell在第一个Create Proc命令崩溃。当“返回数据集”批处理作为文件中的最后一批添加时,它不会运行。

有解决办法吗?我想我可以使用.Net对象($Command = New-Object System.Data.SqlClient.SqlCommand)来提交这些脚本,但似乎最好使用本机PowerShell结构。

我正在使用PowerShell v4,调用SQL Server 2008.我正在使用的cmdlet是:

Invoke-sqlcmd  -ServerInstance $SQLInstance  -Database $DBName  -InputFile $UpdateScript  -Variable $SQLCmdVariables  -AbortOnError  -IncludeSQLUserErrors  -OutputSQLErrors $true | Out-File -filePath FileSystem::$DatabaseLog -width 200

1 个答案:

答案 0 :(得分:0)

" GO"它不是一个真实的声明,它是一个实用命令,它只在管理工作室或sqlcmd中用于分割命令批处理。使用分号" ; "代替。

基于ODBC或OLE DB API的应用程序在尝试执行GO命令时会收到语法错误。 SQL Server实用程序从不向服务器发送GO命令。 在GO

之后不要使用分号作为语句终止符

您可以在此处查看一些详细信息: https://msdn.microsoft.com/en-US/library/ms188037.aspx?f=255&MSPPError=-2147217396

这似乎对我有用:

$batch = @"
create procedure proc1
as 
    select @@version;
go
create procedure proc2
as 
    select @@version;
go
create procedure proc3
as 
    select @@version;
"@

Invoke-Sqlcmd -Query $batch