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 传递参数时它工作正常。
我是 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 传递参数时它工作正常。