[英]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.