我有一个包含多个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
答案 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