2015-03-23 7 views
0

У меня проблема, когда я пытаюсь заменить следующий код другим решением. В настоящее время я использую курсор, но он работает медленно. Я понимаю, что итеративные решения могут быть выполнены только курсорами или циклами, но я пытаюсь найти подход на основе набора и исчерпать идеи. Я надеялся, что могу найти здесь какое-то вдохновение. Спасибо всем.Итериальное выполнение хранимой процедуры с основанием набора основано

--used to find a unique list of Some_ID 
@Id1, @Id2, @Id3 

DECLARE SomeCursor CURSOR FOR 
      SELECT SOME_ID FROM SomeTable 
        WHERE [email protected] AND [email protected] and [email protected] 

    OPEN SomeCursor 
      FETCH NEXT FROM SomeCursor INTO @SomeID 
    WHILE @@Fetch_Status = 0  
    BEGIN 

     Print @SomeID 

     --simply populates a single table with values pulled from 
     --other tables in the database based on the give parameters. 
     EXEC SP_PART1 @SomeID, @parameters... 
     print 'part 2 starting' 
     EXEC SP_PART2 @SomeID, @parameters... 

     FETCH NEXT FROM SomeCursor INTO @SomeID 

     print getdate() 

    END 
    CLOSE SomeCursor; 
    DEALLOCATE SomeCursor; 
+0

Не зная, на что 'EXEC SP_PART1' и' EXEC SP_PART2' ответить невозможно. –

+0

обновленные комментарии для объяснения СП – user2009859

ответ

0

Ваш единственный вариант, чтобы сделать это на основе набор переписать СФС, чтобы сделать их основе установить (с помощью таблиц-valed параметров Intead отдельных из них) или писать набор на основе кода в этом прок вместо повторного - использование procs, предназначенных для использования в одиночной записи. Это случай, когда повторное использование кода обычно не подходит.

0

Я не слишком уверен, что вы хотите, но почему бы не использовать ваш оператор select для создания ваших sql-скриптов и выполнить их все сразу с чем-то вроде этого.

DECLARE @sql VARCHAR(MAX); 

SELECT @sql = COALESCE(@sql,'') + 'EXEC SP_Part1 ' + SOME_ID + '; EXEC SP_Part2 ' + SomeID + '; GO ' 
FROM SomeTable 
WHERE [email protected] AND [email protected] and [email protected] 

EXEC (@sql)