SqlCmd 命令执行停止

SqlCmd command execution stops

我是 sqlcmd 的新手,我正在尝试执行此 sql cmd 代码:

:Connect SERVERNAME
!!if exist $(FullBackup) del $(FullBackup)
GO
!!if exist $(TransactionLog) del $(TransactionLog)
GO

我正在通过 powershell 脚本传递变量 $(FullBackup)$(TransactionLog)

& $app -i $syncFileLocal -E -b -v FullBackup=("""$fullbackup""") TransactionLog=("""$transactionLog""");

其中 syncFileLocal 包含上述 sqlcmd 命令。

不知何故,执行在第二个 :Connect PROD-SQLMASTER

后停止

更新:

当我为 $(FullBackup)$(TransactionLog) 使用 harcorded 值时 该脚本似乎有效。无论如何我可以通过 powershell 传递变量来做到这一点吗?

而不是:

FullBackup=("""$fullbackup""") TransactionLog=("""$transactionLog""")

尝试:

FullBackup="""$fullbackup""" TransactionLog="""$transactionLog"""

如果你使用()grouping operator,它的输出作为一个单独的参数传递,这不是你想要的。


但是请注意,从 v7.0 开始,甚至 上述解决方案也依赖于 PowerShell 从根本上破坏了向外部程序传递参数的功能 - 请参阅

如果sqlcmd实现得当(不知道是不是),正确的传参方式是:

FullBackup=$fullbackup TransactionLog=$transactionLog

这样,您将依赖 PowerShell 的按需在幕后重新引用参数,如果 $fullbackup$translactionLog 包含空格,则参数将作为,例如,"FullBackup=c:\path\to\backup 1""TransactionLog=c:\path\to\log 1"

我找到了解决办法。我建议通过适当的验证使用它

:Connect $(ServerMaster)
DECLARE @resultBkp INT
EXEC master.dbo.xp_fileexist N'$(FullBackup)', @resultBkp OUTPUT
IF (@resultBkp = 1)
BEGIN
    DECLARE @resultDeleteBkp INT
    EXECUTE master.sys.xp_cmdshell '$(FullBackup)'
    EXEC master.dbo.xp_fileexist N'$(FullBackup)', @resultDeleteBkp OUTPUT
    IF (@resultDeleteBkp = 0)
    BEGIN
        PRINT 'Backup Deleted'
    END
    ELSE
    BEGIN
        SELECT ERROR_NUMBER(), ERROR_MESSAGE();
        RETURN;
    END
END
ELSE
BEGIN
    PRINT 'Backup file not found'
END

我用master.dbo.xp_fileexist检查文件是否存在,然后用 master.sys.xp_cmdshell命令删除文件。

要为数据库服务器启用 master.sys.xp_cmdshell,请使用此解决方案: Enable 'xp_cmdshell' SQL Server

我已经测试过了,当我通过 powershell 传递参数时它工作正常。