在存储过程中使用带有动态SQL的游标[英] Using a cursor with dynamic SQL in a stored procedure

本文是小编为大家收集整理的关于在存储过程中使用带有动态SQL的游标的处理方法,想解了在存储过程中使用带有动态SQL的游标的问题怎么解决?在存储过程中使用带有动态SQL的游标问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有一个在存储过程中创建的动态 SQL 语句.我需要使用游标迭代结果.我很难找出正确的语法.这就是我正在做的事情.

SELECT @SQLStatement = 'SELECT userId FROM users'

DECLARE @UserId

DECLARE users_cursor CURSOR FOR
EXECUTE @SQLStatment --Fails here. Doesn't like this

OPEN users_cursor
FETCH NEXT FROM users_cursor
INTO @UserId

WHILE @@FETCH_STATUS = 0
BEGIN

EXEC asp_DoSomethingStoredProc @UserId

END
CLOSE users_cursor
DEALLOCATE users_cursor

这样做的正确方法是什么?

推荐答案

游标只接受选择语句,因此如果 SQL 确实需要动态,请将声明游标作为您正在执行的语句的一部分.要使以下内容正常工作,您的服务器必须使用全局游标.

Declare @UserID varchar(100)
declare @sqlstatement nvarchar(4000)
--move declare cursor into sql to be executed
set @sqlstatement = 'Declare  users_cursor CURSOR FOR SELECT userId FROM users'

exec sp_executesql @sqlstatement


OPEN users_cursor
FETCH NEXT FROM users_cursor
INTO @UserId

WHILE @@FETCH_STATUS = 0
BEGIN
Print @UserID
EXEC asp_DoSomethingStoredProc @UserId

FETCH NEXT FROM users_cursor --have to fetch again within loop
INTO @UserId

END
CLOSE users_cursor
DEALLOCATE users_cursor

如果您需要避免使用全局游标,您还可以将动态 SQL 的结果插入到临时表中,然后使用该表填充您的游标.

Declare @UserID varchar(100)
create table #users (UserID varchar(100))

declare @sqlstatement nvarchar(4000)
set @sqlstatement = 'Insert into #users (userID) SELECT userId FROM users'
exec(@sqlstatement)

declare users_cursor cursor for Select UserId from #Users
OPEN users_cursor
FETCH NEXT FROM users_cursor
INTO @UserId

WHILE @@FETCH_STATUS = 0
BEGIN

EXEC asp_DoSomethingStoredProc @UserId

FETCH NEXT FROM users_cursor
INTO @UserId

END
CLOSE users_cursor
DEALLOCATE users_cursor

drop table #users

本文地址:https://www.itbaoku.cn/post/1793959.html