2014-11-21 153 views
0

我有一个存储过程写入数据到表。循环为存储过程

我想要做的是使用一个变量在存储过程中
和变量是从一个单独的查询

采取例如分配项目编号:select ITEM_NUMBER from xTable 回报

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

我想要一个循环来分配这些变量,每个变量从A1J9并且每次运行存储过程

这将多次运行存储过程以运行结果表中的所有项目。

感谢

+0

使用CURSOR进行循环。 – 2014-11-21 11:01:53

+0

你好,回答是在这里:http://stackoverflow.com/questions/27058848/sql-while-to-read-a-table-data-to-a-variable/27059415#27059415 – Matej 2014-11-21 11:09:05

+0

在一个简单的级别,使用FAST_FORWARD游标。但是等等,总的来说更好的方法是编写另一个在整个集合上工作的存储过程。 – Jodrell 2014-11-21 11:23:03

回答

0

试试这个使用CURSOR

DECLARE @sItemNumber AS VARCHAR(MAX) 

DECLARE TestCursor CURSOR FOR 
(
    select ITEM_NUMBER from xTable 
) 

OPEN TestCursor 
FETCH NEXT FROM TestCursor INTO @sItemNumber 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    EXEC ProcedureName @sItemNumber 
    FETCH NEXT FROM TestCursor INTO @sItemNumber 
END 

CLOSE TestCursor 
DEALLOCATE TestCursor 
+0

您错过了“从TestCursor INTO @sItemNumber获取下一步”之前的循环:) – hatem87 2014-11-21 11:12:58

+0

我有更新它。谢谢.. – 2014-11-21 11:16:16

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

Upvoted因为光标是FAST_FORWARD – Jodrell 2014-11-21 11:21:09

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是唯一支持的提取选项。如果未指定STATIC,KEYSET或DYNAMIC关键字指定FORWARD_ONLY,则光标将作为DYNAMIC游标运行。如果未指定FORWARD_ONLY和SCROLL,则除非指定了关键字STATIC,KEYSET或DYNAMIC,否则FORWARD_ONLY是默认值。 STATIC,KEYSET和DYNAMIC游标默认为SCROLL。与数据库API(如ODBC和ADO)不同,FORWARD_ONLY受STATIC,KEYSET和DYNAMIC Transact-SQL游标的支持。