2014-11-21 7 views
0

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

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

Например: select ITEM_NUMBER from xTable возвращает

ITEM_NUMBER 
------------ 
    A1 
    B2 
    C4 
    D7 
    J9 

I хотите, чтобы петля назначала переменную, каждая из которых составляла от A1 до J9 и каждый раз хранила хранимую процедуру

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

Благодаря

+0

Используйте CURSOR для зацикливания. –

+0

привет, ответ здесь: http://stackoverflow.com/questions/27058848/sql-while-to-read-a-table-data-to-a-variable/27059415#27059415 – Matej

+0

На простом уровне используйте Курсор FAST_FORWARD. Но подождите, лучше всего написать другую хранимую процедуру, которая работает на всем наборе. – Jodrell

ответ

0

Попробуйте это с помощью CURSOR.

+0

Вы пропустили «FETCH NEXT FROM TestCursor INTO @sItemNumber» до начала цикла :) – hatem87

+0

У меня есть обновление. спасибо .. –

1

Похоже, что ваш лучший вариант - использовать курсор.

Курсор проходит через запрос и задает переменную из каждой строки результатов запроса. Вы можете вызвать хранимую процедуру в теле курсора, передав переменную, которую вы заполнили в качестве параметра процедуры.

Синтаксис курсора выглядит следующим образом:

DECLARE @item CHAR(2) 

DECLARE item_cursor CURSOR FAST_FORWARD READ_ONLY FOR 
SELECT ITEM_NUMBER from xTable 

OPEN item_cursor 

FETCH NEXT FROM item_cursor INTO @item 

WHILE @@FETCH_STATUS = 0 
BEGIN 

--Execute your stored procedure here, supplying @item as the parameter 

FETCH NEXT FROM item_cursor INTO @item 

END 

CLOSE item_cursor 

DEALLOCATE item_cursor 
+0

Активировано, потому что курсор FAST_FORWARD – Jodrell

0

Попробуйте, как это с помощью

DECLARE @itemNumber VARCHAR(50); 
 

 
DECLARE db_cursor CURSOR FOR 
 
SELECT ITEM_NUMBER FROM xTable; 
 

 
OPEN db_cursor 
 
FETCH NEXT FROM db_cursor INTO @itemNumber 
 

 

 
WHILE @@FETCH_STATUS = 0 
 
BEGIN 
 
     
 
\t -- call your stored procedure here 
 

 
     FETCH NEXT FROM db_cursor INTO @itemNumber 
 
END 
 

 
CLOSE db_cursor 
 
DEALLOCATE db_cursor

1

Два способа

Select ITEM_NUMBER into #X from xTable 

DECLARE @PartVar varchar(10) 
WHILE(0 < (Select Count(*) from #X)) 
    BEGIN 
    SET ROWCOUNT 1 
    Select @PartVar = ITEM_NUMBER from #X 
    -- EXEC PROC @PartVar 
    SET ROWCOUNT 0 
    DELETE #X where ITEM_NUMBER = @PartVar 
    END 

или

DECLARE @PartVar varchar(10) 
DECLARE LOC CURSOR FORWARD_ONLY FOR SELECT ITEM_NUMBER from xTable 
OPEN LOC 
FETCH NEXT FROM LOC into @PartVar 

WHILE(@@FETCH_STATUS = 0) 
BEGIN 
    EXEC PROC @PartVar 
    FETCH NEXT FROM LOC into @PartVar 
END 

CLOSE LOC 
DEALLOCATE LOC 

http://msdn.microsoft.com/en-us/library/ms180169.aspx

FORWARD_ONLY Указывает, что курсор можно прокручивать только от первой до последней строки. FETCH NEXT - единственная поддерживаемая опция выборки. Если FORWARD_ONLY указан без ключевых слов STATIC, KEYSET или DYNAMIC, курсор работает как курсор DYNAMIC. Если не указано ни FORWARD_ONLY, ни SCROLL, FORWARD_ONLY является значением по умолчанию, если не указаны ключевые слова STATIC, KEYSET или DYNAMIC. STATIC, KEYSET и DYNAMIC курсоры по умолчанию для SCROLL. В отличие от баз данных API, таких как ODBC и ADO, FORWARD_ONLY поддерживается с помощью STATIC, KEYSET и DYNAMIC Transact-SQL курсоров.

Смежные вопросы