0

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

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

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

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

wheresyncFileLocal包含上面的 sqlcmd 命令。

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

更新:

当我使用硬编码值时$(FullBackup)$(TransactionLog) 脚本似乎可以工作。无论如何我可以通过powershell传递变量来做到这一点吗?

4

2 回答 2

0

代替:

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

尝试:

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

如果您使用分组运算符(),其输出将作为单独的参数传递,这不是您想要的。


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

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

FullBackup=$fullbackup TransactionLog=$transactionLog

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

于 2020-07-25T23:01:36.880 回答
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数据库服务器,请使用此解决方案: 启用“xp_cmdshell”SQL Server

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

于 2020-07-26T17:51:11.120 回答