【问题标题】:SqlCmd command execution stopsSqlCmd 命令执行停止
【发布时间】:2020-11-15 09:22:29
【问题描述】:

我是 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传递变量来做到这一点吗?

【问题讨论】:

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


    【解决方案1】:

    代替:

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

    尝试:

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

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


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

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

    FullBackup=$fullbackup TransactionLog=$transactionLog
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-03-09
        • 1970-01-01
        • 1970-01-01
        • 2018-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-14
        • 1970-01-01
        相关资源
        最近更新 更多