如何向SQL代理作业提供SQL-CMD变量?

时间:2015-07-07 07:01:23

标签: sql sql-server jobs sqlcmd sql-agent-job

我在SQL实例中创建了一个Job。 请考虑将以下SQL-CMD脚本设置为在执行步骤时运行:

:setvar DatabaseName "BillingDatabase"
:setvar ReportingDatabaseName "BillingDatabase_Reporting"

BEGIN TRANSACTION
SET NOCOUNT ON

USE [$(NzeurReportingDatabaseName)]......

COMMIT TRANSACTION

此作业设置为在预期数据库名称不同的各种环境中运行。 例如,生产环境可能有类似的东西 - " [CompanyName] .Billing.Database",&" [CompanyName] .Billing.ReportingDatabase"

如何根据创建作业的环境配置此SQL作业以提供这些CMD变量。 这是因为,我们的部署过程相当自动化,我们不想在创建作业后在SQL作业步骤中手动编辑变量。

知道如何实现这个目标吗?

1 个答案:

答案 0 :(得分:0)

我找不到解决此问题的任何直接解决办法。 但编写了PowerShell脚本来替换脚本文件中的SQL-CMD变量:

function replaceCmdletParameterValueInFile( $file, $key, $value ) {
    $content = Get-Content $file
    if ( $content -match ":setvar\s*$key\s*[\',\""][\w\d\.\:\\\-]*[\'\""_]" ) {
        $content -replace ":setvar\s*$key\s*[\',\""][\w\d\.\:\\\-]*[\'\""_]", ":setvar $key $value" |
        Set-Content $file     
    } else {
        Add-Content $file ":setvar $key $value"
    }
}

在部署期间,我调用此函数来替换Invoke-SqlCmd之前的数据库名称。

replaceCmdletParameterValueInFile $scriptfile "DatabaseName" "`"$MyDatabaseName`""