2012-05-17 5 views
0

У меня есть определенный пользователь типа, как показано ниже:Pass индивидуальный параметра из набора для SQL хранимой процедуры

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_ расчет. Каков наилучший способ назвать это?

ответ

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; 
+0

Пробовал оба и производительность аналогична. Благодаря! – Icerman

+0

@Icerman да, я бы не ожидал большой разницы в производительности, поскольку они делают практически то же самое. Верхняя версия - это всего лишь меньше ввода (и не склонна забывать оптимизированные параметры курсора, что может привести к разнице в производительности). Возможно, интересное чтение: http://sqlblog.com/blogs/aaron_bertrand/archive/2012/01/26/the-fallacy-that-a-while-loop-isn-t-a-cursor.aspx –

0

Для того, чтобы использовать пользовательский тип, хранимую процедуру, которая использует для этого нужно иметь аргумент типа установки, как неизменяемые.

Поскольку вы не можете изменить хранимую процедуру, ваш лучший выбор, вероятно, следует за ответом Аарона на это.