我有一个将数据写入表的存储过程。
我想要做的是在存储过程中使用变量
以及要从单独的查询中分配项目编号的变量
例如:select ITEM_NUMBER from xTable
返回
ITEM_NUMBER
------------
A1
B2
C4
D7
J9
我想要一个循环来分配从A1
到J9
的每个变量并每次运行存储过程
这将多次运行存储过程以运行结果表中的所有项目。
谢谢
答案 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
答案 1 :(得分: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,则FORWARD_ONLY是默认值,除非指定了关键字STATIC,KEYSET或DYNAMIC。 STATIC,KEYSET和DYNAMIC游标默认为SCROLL。与ODBC和ADO等数据库API不同,STATIC,KEYSET和DYNAMIC Transact-SQL游标支持FORWARD_ONLY。
答案 2 :(得分: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
答案 3 :(得分: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
-- call your stored procedure here
FETCH NEXT FROM db_cursor INTO @itemNumber
END
CLOSE db_cursor
DEALLOCATE db_cursor