将单个参数从一个集传递给SQL存储过程

时间:2012-05-17 00:44:48

标签: sql-server loops

我有一个用户定义的类型如下:

CREATE TYPE [Integer_udt] AS  TABLE (
    [Id] INT NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC));

然后我从查询中填充了它:

DECLARE @Ids [Integer_udt]
    INSERT INTO @Ids
        SELECT table1.Id 
        FROM table1 

接下来,我需要将单个参数传递给接受单个Id的存储过程:

EXEC prc_complicated_calculation @Id

假设我无法更改prc_complicated_calculation。叫它的最好方法是什么?

2 个答案:

答案 0 :(得分:3)

我的第一个答案是简单逻辑和代码行的动态SQL。

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';

SELECT @sql = @sql + N'EXEC prc_complicted_calculation ' 
    + RTRIM(Id) + ';'
    FROM @Ids;

EXEC sp_executesql @sql;

你也可以用循环来做这件事,但我认为这样做的工作量很少(除非你对动态SQL过敏)。

DECLARE @i INT;
DECLARE c CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR SELECT Id FROM @Ids;

OPEN c;

FETCH NEXT FROM c INTO @i;

WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC prc_complicated_calculation @i;

    FETCH NEXT FROM c INTO @i;
END

CLOSE c;
DEALLOCATE c;

答案 1 :(得分:0)

为了使用自定义类型,使用它的存储过程需要将type参数设置为READONLY。

由于你不能改变存储过程,你最好的选择可能是遵循Aaron对此的回答。