我需要创建一个在临时作业中调用的存储过程,所以我正在做:
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?
答案 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';
我可能会将永久表的清理作为一个单独的工作步骤。
问题在于,工作代表了(对于计算机)远期未来的事情。表变量表示仅存在于此处的对象。它们也是会话的本地 - 当作业将来运行时,它将在新会话中运行每一步。