如何将表类型传递给作业中的存储过程?

时间:2017-03-30 11:20:43

标签: sql sql-server

我需要创建一个在临时作业中调用的存储过程,所以我正在做:

CREATE PROCEDURE create_test_job
    @criteria Criteria READONLY
AS
BEGIN
    DECLARE @jobName nvarchar(max);
    SET @jobName = 'test';

    --Get database name
    DECLARE @dbName sysname;
    SELECT @dbName = DB_NAME();

    --Create job
    EXEC msdb.dbo.sp_add_job @job_name = @jobName;

    --Create step
    EXEC msdb.dbo.sp_add_jobstep
        @job_name = @jobName,
        @step_name = 'Step 1',
        @subsystem = N'TSQL',
        @database_name = @dbName,
        @command = N'EXEC my_actual_sp ' + @criteria;


    ----TODO Schedule the job at a specified date and time

    ----TODO Add the job to the SQL Server server

    EXEC msdb.dbo.sp_delete_job @job_name = @jobName;
END
GO

显然@command是错误的。如何将表格类型传递给我的sp?

1 个答案:

答案 0 :(得分:0)

您必须将内容泄漏到真实的桌子中,然后重新阅读您的工作内容。

类似的东西:

INSERT INTO PendingCriteria (/* Columns */)
SELECT /* Columns */ FROm @Criteria

...

@command = N'DECLARE @C Criteria
             INSERT INTO @C (/* Columns */) SELECT /* Columns */ FROM PendingCriteria
      EXEC my_actual_sp @C';

我可能会将永久表的清理作为一个单独的工作步骤。

问题在于,工作代表了(对于计算机)远期未来的事情。表变量表示仅存在于此处的对象。它们也是会话的本地 - 当作业将来运行时,它将在新会话中运行每一步。