在 SQL Server 作业的步骤之间传递变量/值的最佳方法是什么

Jam*_*mes 3 sql-server jobs

例如,如果我创建一个 dtsx 包来填写 Excel 工作表,但只有在有实际数据时才通过电子邮件发送出去?

Han*_*non 6

在 SQL Server 代理 T-SQL 作业步骤之间传递状态的唯一方法是通过真实的(即非 #temp)表,该表可能只存在于 tempdb 数据库中。即使全局临时表 (##temp) 也不够,因为即使多个会话可以访问它,每个 T-SQL 作业步骤都在其自己的会话中运行,该会话在步骤开始时创建并在步骤结束时结束。步骤。要运行的第一个会话将创建 ##temp 表,但是当该步骤结束时,##temp 表将在第二步开始之前被销毁。

我建议在工作的第一步中在 tempdb 中创建一个表,如下所示:

USE tempdb;
IF OBJECT_ID(N'dbo.JobStepState', N'U') IS NOT NULL
DROP TABLE dbo.JobStepState;
CREATE TABLE dbo.JobStepState
(
    VariableName varchar(25) NOT NULL
        CONSTRAINT JobStepState_pk
        PRIMARY KEY CLUSTERED
    , VariableValue varchar(25) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

然后,在后续步骤中,您可以使用以下命令将变量插入到表中:

INSERT INTO tempdb.dbo.JobStepState (VariableName, VariableValue)
VALUES ('SomeVariableName', 'SomeValue');
Run Code Online (Sandbox Code Playgroud)

在后面的作业步骤中,您可以使用以下方式引用该值:

DECLARE @val varchar(25);
SET @val = (
    SELECT jss.VariableValue 
    FROM tempdb.dbo.JobStepState jss 
    WHERE jss.VariableName = 'SomeVariableName'
    );
IF @val = 'SomeValue'
    PRINT N'Yes'
ELSE
    PRINT N'No';

DROP TABLE dbo.JobStepState;
Run Code Online (Sandbox Code Playgroud)