SqlCmd命令执行停止

时间:2020-07-25 17:59:18

标签: sql sql-server powershell sqlcmd invoke-sqlcmd

我是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)使用经换算的值时 该脚本似乎有效。无论如何,我可以通过Powershell传递变量来做到这一点吗?

2 个答案:

答案 0 :(得分:0)

代替:

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

尝试:

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

如果您使用()grouping operator),则其输出将作为单独参数传递,这不是您想要的。< / p>


但是请注意,即使以上解决方案也依赖于PowerShell从v7.0开始,将PowerShell从根本上破坏了参数传递给外部程序-参见this answer

如果sqlcmd的实现正确(我不知道是否正确),则传递参数的正确方法是

FullBackup=$fullbackup TransactionLog=$transactionLog

那样,您将依靠PowerShell按需在幕后对参数进行重新引用,如果$fullbackup$translactionLog包含空格,则将参数传递为实例"FullBackup=c:\path\to\backup 1""TransactionLog=c:\path\to\log 1"

答案 1 :(得分:0)

我找到了解决方案。我建议将其与适当的验证配合使用

: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传递参数时,它可以正常工作。