0

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

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。最好的称呼是什么?

4

2 回答 2

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;
于 2012-05-17T01:02:06.953 回答
0

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

由于您无法更改存储过程,因此您最好的选择可能是遵循 Aaron 对此的回答。

于 2012-05-17T01:07:28.513 回答