繁体   English   中英

在 SQL Server 中使用动态表名定义游标

[英]Define Cursor with Dynamic Table Name in SQL Server

DECLARE cursor1 CURSOR LOCAL FOR 
    SELECT ORDER_ID
    FROM @TableName1

OPEN cursor1
FETCH next FROM cursor1 INTO @ORDER_ID

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT 'Hi'

    FETCH NEXT FROM cursor1 INTO @ORDER_ID
END

CLOSE cursor1
DEALLOCATE cursor1

如何在SELECT查询中使用动态表名来定义游标?

@TableName1是一个存储表名的VARCHAR变量。

declare @TableName1 as varchar(256)
set @TableName1 = 'TableName'

declare @sql as nvarchar(max)
set @sql = 'DECLARE cursor1 CURSOR GLOBAL FOR SELECT ORDER_ID FROM ' + cast(@TableName1 as nvarchar(256))
exec(@sql)

OPEN cursor1
FETCH next FROM cursor1 INTO @ORDER_ID

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT 'ORDER_ID=' + cast(@ORDER_ID as varchar(256))

    FETCH NEXT FROM cursor1 INTO @ORDER_ID
END

CLOSE cursor1
DEALLOCATE cursor1

您可以将感兴趣的记录复制到表变量/临时表中,然后在该表上声明光标:

declare @t table (
    OrderId int
);

declare @OrderId int, @Sql nvarchar(max);

set @Sql = N'select ORDER_ID from ' + @TableName1;

insert into @t (OrderId)
exec (@Sql);

DECLARE cursor1 CURSOR LOCAL fast_forward FOR
SELECT OrderId from @t;

OPEN cursor1;

WHILE 1=1 BEGIN
    FETCH NEXT FROM cursor1 INTO @ORDER_ID;

    if @@fetch_status != 0
        break;

    PRINT 'Hi';
END

CLOSE cursor1;
DEALLOCATE cursor1;

您可以通过使用 sp_executesql 并输出打开的游标将游标分配给动态/变量表。 游标名称也可以是可变的。

declare @TableName1 varchar(50) = 'TableName';
--declare @sql nvarchar(max)= concat('set @mycursor = cursor for select * from ', QUOTENAME(@TableName1), '; open @mycursor;');
declare @sql nvarchar(max) = 'set @dynamicsqlcursor = cursor for select name from sys.objects; open @dynamicsqlcursor;';

declare @mycursor cursor, 
        @objname sysname;

exec sp_executesql @stmt = @sql, @params = N'@dynamicsqlcursor cursor output', @dynamicsqlcursor = @mycursor output; --the output cursor must be open

--no need to open the cursor, it is output "opened"
--open @mycursor;

fetch next from @mycursor into @objname;

while @@fetch_status = 0
begin
    print 'object name=' + @objname;

    fetch next from @mycursor into @objname;
end

close @mycursor;
deallocate @mycursor;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM