tsql - 在存储过程中使用带有动态 SQL 的游标

标签 tsql stored-procedures dynamic-sql database-cursor

我有一个在存储过程中创建的动态 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

正确的做法是什么?

最佳答案

游标只接受 select 语句,因此如果 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

关于tsql - 在存储过程中使用带有动态 SQL 的游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1045880/

相关文章:

mysql - 搜索如何使用 IN 和 OUT 参数将多个部分连接到一个 SELECT

c# - 从组合框 C# 表单发送文本作为 SQL 过程的输入

sql - Truncate SELECT table_name 语法错误

postgresql - 从保存列名的变量中引用记录的列

sql按次数定义一行/它如何显示为其他行

sql - 如何根据某些条件跳过 MSSQL Cursor 中的一行(迭代)?

sql - 使用数据透视但不聚合将垂直数据转换为水平数据?

mysql - 为mysql中的out参数分配变量值

mysql - SQL 未按预期工作

plsql - 清理作为动态 PL/SQL 命令一部分的用户输入