日期:2014-05-17  浏览次数:20467 次

在存储过程中使用游标的问题
事情是这样的,今天我想在存储过程中使用游标,但由于有动态数据,必须使用语句拼凑执行,但总出现问题,弄了半天无果,特来请教,请高手多多指点哈~


CREATE PROCEDURE p_orderinfo
@age int,
@orderitem_cursor CURSOR VARYING OUTPUT
AS
DECLARE @sql VARCHAR(1000) 
SET @sql='SET @orderitem_cursor = CURSOR FOR SELECT name  FROM student WHERE age>'+CONVERT(VARCHAR,@age)+' ;';
EXEC(@sql);
--SET @orderitem_cursor = CURSOR FOR SELECT name FROM v_orderitem;
OPEN @orderitem_cursor;
GO
DROP PROCEDURE p_orderinfo;
--测试
DECLARE 
@orderitem_cursor CURSOR,
@name VARCHAR(20)
BEGIN
EXEC p_orderinfo 22,@orderitem_cursor OUTPUT;
FETCH NEXT FROM @orderitem_cursor INTO @name;
WHILE  @@FETCH_STATUS=0
BEGIN
SELECT @name;
FETCH NEXT FROM @orderitem_cursor INTO @name;
END;
CLOSE @orderitem_cursor;
DEALLOCATE @orderitem_cursor;
END;

报错如下:
消息 137,级别 15,状态 3,第 1 行
必须声明标量变量 "@orderitem_cursor"。
消息 16950,级别 16,状态 2,过程 p_orderinfo,第 7 行
目前没有为变量 '@orderitem_cursor' 分配游标。
消息 16950,级别 16,状态 2,第 5 行
目前没有为变量 '@orderitem_cursor' 分配游标。
消息 16950,级别 16,状态 2,第 12 行
目前没有为变量 '@orderitem_cursor' 分配游标。
消息 16950,级别 16,状态 2,第 13 行
目前没有为变量 '@orderitem_cursor' 分配游标。

请高手帮小弟一把
存储过程,游标,拼凑语句

------解决方案--------------------

CREATE PROCEDURE p_orderinfo
@age int,
@orderitem_cursor CURSOR VARYING OUTPUT
AS
DECLARE @sql NVARCHAR(1000) 
declare @parmsDefine nvarchar(500)
set @parmsDefine=N'@_cursor CURSOR'
SET @sql=N'SET @_cursor = CURSOR FOR SELECT name  FROM student WHERE age>'+CONVERT(VARCHAR,@age)+' ;';
EXEC sp_executesql @sql,@parmsDefine,@_cursor=@orderitem_cursor;

--SET @orderitem_cursor = CURSOR FOR SELECT name FROM v_orderitem;
OPEN @orderitem_cursor;
GO

DROP PROCEDURE p_orderinfo;
--测试
DECLARE 
@orderitem_cursor CURSOR,
@name VARCHAR(20)

EXEC p_orderinfo 22,@orderitem_cursor OUTPUT;

FETCH NEXT FROM @orderitem_cursor INTO @name;
WHILE  @@FETCH_STATUS=0
BEGIN
SELECT @name;
FETCH NEXT FROM @orderitem_cursor INTO @name;
END;
CLOSE @orderitem_cursor;
DEALLOCATE @orderitem_cursor;

------解决方案--------------------
引用:
Quote: 引用:

EXEC(@sql);

lz你的这句sql语句存在问题


我看了下你的代码,不知道exec 还有这种用法,就是后面带参数的那种,可不可以解释下?