我希望在这里运行此代码:
Write-Host "Running script"
$SQLServer4 = "ServerA"
$Database4 = 'master'
Invoke-Sqlcmd -ServerInstance $SQLServer4 -Database $Database4 -InputFile "C:UsersDocumentsScriptsSaveSite.txt"
脚本中有一个提交语句,它被注释掉了,你必须手动运行它,只要输出看起来不错。当我在SSMS中这样做时,这很好,但是我不确定如何从PowerShell中运行提交语句。
我试着运行以下命令:
Invoke-Sqlcmd -Query "commit" -ServerInstance "ServerA"
,我得到这个错误:
Invoke-Sqlcmd : The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.
Msg 3902, Level 16, State 1, Procedure , Line 1.
我该怎么做呢?
您可以直接将COMMIT
连接到脚本
Write-Host "Running script"
$SQLServer4 = "ServerA"
$Database4 = 'master'
$script = Get-Content -Path "C:UsersDocumentsScriptsSaveSite.txt" -Raw;
$script += "
IF @@TRANCOUNT > 0
COMMIT;
";
Invoke-Sqlcmd -ServerInstance $SQLServer4 -Database $Database4 -Query $script;
由于使用的是sqlcmd,因此可以在文件中使用sqlcmd变量。下面是我做的一个快速测试:
if ('$(COMMIT)' = '1')
print 'committing';
else
print 'not committing';
然后,当你去调用它时,你可以选择传递一个提交变量的值
C:temp
> sqlcmd -S . -E -i .sqlcmd-test.sql -v COMMIT=1
committing
C:temp
> sqlcmd -S . -E -i .sqlcmd-test.sql
'COMMIT' scripting variable not defined.
not committing
C:temp
>
我认为这是一个功能,而不是一个bug,在这种情况下,你没有传递一个变量警告你COMMIT变量没有被定义。这是一个信号,如果你想提交结果,你必须做点什么。
在会话结束时隐式提交事务。
如果你需要保持一个事务打开,你将不能使用Invoke-SqlCommand
相反,您可能需要手动创建和使用ADO。SqlConnection
、SqlCommand
、SqlTransaction
等网络对象
这是一个坏主意,顺便说一句。SQL Server会像锁一样持有资源,直到事务完成,这是在服务器上创建死锁的好方法。事务不用于确认长时间运行的操作。相反,它们的目的是防止复杂操作中的错误/不完成,这些操作仍然应该在合理的时间内完成。如果您有需要审查的具有较低前期信心的复杂操作,那么它们应该在一个(简要)事务中被推送到一个暂存区域,然后在确认后被推送到另一个(简要)事务中。