我是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传递变量来做到这一点吗?
答案 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传递参数时,它可以正常工作。