我有一个用户定义的类型如下:
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。叫它的最好方法是什么?
答案 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对此的回答。