从PowerShell提交SQL事务



我希望在这里运行此代码:

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。SqlConnectionSqlCommandSqlTransaction等网络对象

这是一个坏主意,顺便说一句。SQL Server会像锁一样持有资源,直到事务完成,这是在服务器上创建死锁的好方法。事务不用于确认长时间运行的操作。相反,它们的目的是防止复杂操作中的错误/不完成,这些操作仍然应该在合理的时间内完成。如果您有需要审查的具有较低前期信心的复杂操作,那么它们应该在一个(简要)事务中被推送到一个暂存区域,然后在确认后被推送到另一个(简要)事务中。

相关内容

  • 没有找到相关文章

最新更新