Sql 在表变量内的表上设置光标

Sql 在表变量内的表上设置光标,sql,tsql,stored-procedures,Sql,Tsql,Stored Procedures,全部, 试图在表变量内的表值上设置光标,但无效。有人能评论我如何解决这个问题吗 **下面的代码是从另一个存储过程调用的,该存储过程为tablename变量提供值** ALTER PROCEDURE [dbo].[usrSetLTDNormDist] -- Add the parameters for the stored procedure here @TableName Sysname, ---... DECLARE @SQLCommand1 NVARCHAR(MA

全部,

试图在表变量内的表值上设置光标,但无效。有人能评论我如何解决这个问题吗

**下面的代码是从另一个存储过程调用的,该存储过程为tablename变量提供值**

ALTER PROCEDURE [dbo].[usrSetLTDNormDist]
    -- Add the parameters for the stored procedure here
    @TableName Sysname,

---...

    DECLARE @SQLCommand1 NVARCHAR(MAX) = N'
    Set @RecCursor1 = Cursor For
        Select [Volume], [TRANSDATE] from @TableName'

    EXECUTE dbo.sp_executesql @sqlCommand1  

    -- Open  Cursor
    Open @RecCursor1
    Fetch Next From @RecCursor1
    Into @Volume, @TransDate

---...

DECLARE
EXECUTE
语句之间添加
PRINT@SQLCommand1
,以查看实际执行的内容。根据您的代码片段,您将看到

Set @RecCursor1 = Cursor For
Select [Volume], [TRANSDATE] from @TableName
…也就是说,您在@TableName中设置的值不会自动添加到脚本中。以下是我写这些东西的方式:

DECLARE @SQLCommand1 NVARCHAR(MAX)

SET @SQLCommand1 = replace(N'
Set @RecCursor1 = Cursor For
Select [Volume], [TRANSDATE] from <@TableName>'
 ,'<@TableName>', @TableName)

PRINT @SQLCommand1

EXECUTE dbo.sp_executesql @sqlCommand1 
DECLARE@SQLCommand1 NVARCHAR(最大值)
SET@SQLCommand1=replace(N'
设置@RecCursor1=光标用于
从中选择[Volume],[TRANSDATE]
,'',@TableName)
打印@SQLCommand1
执行dbo.sp_executesql@sqlCommand1

我使用<>字符来突出替换的值。

此脚本演示了一般技术:

create table T (ID int not null)
go
insert into T(ID) values (99)
go
declare @TableName sysname
declare @ID int

set @TableName = 'T'

declare @SQL nvarchar(max) = N'declare boris cursor for select ID from ' + 
                               QUOTENAME(@TableName)

exec sp_executesql @SQL

open boris

fetch next from boris into @ID
while @@FETCH_STATUS = 0
begin
    print @ID

    fetch next from boris into @ID
end
close boris
deallocate boris
生成此输出:

(1 row(s) affected)
99

然而,我将提供我通常的警告——如果您希望以相同的方式对多个表进行操作,这通常是数据模型损坏的迹象。通常情况下,应该有一个带有附加列的表,这些列包含用于区分值的数据。

对不起,不太清楚,
@TableName
是字符串还是字符串?不管是哪种方式,正如当前编写的那样,这都是错误的-
EXEC
在新的作用域中运行代码,作用域无法从外部作用域访问变量。Damien,请参见上文,我将变量添加到了代码中。有什么建议吗?在@SQL字符串中声明游标会在我打开它时出错later@HDB-我向您展示了一个完整的脚本,您可以在空白数据库中运行并观察结果。它已经过测试(底部显示的结果来自SQL Server 2012)。我不知道上面的代码与您的实际代码有什么不同,因为您是目前唯一能够确定这一点的人。谢谢Philip,但这仍然不能解决光标问题。这个查询看起来还可以,但由于某些原因,它没有给RecCursor1I赋值,我故意没有多少使用游标的经验。我可以想象,游标是在为运行动态SQL而生成的会话中创建的,在该(动态SQL)会话的持续时间内保持不变,并且在会话关闭时关闭--也就是说,几乎立即关闭?使用动态SQL创建一个视图(该视图将在“创建视图”会话之后保持),对该视图运行光标,然后在完成后删除该视图。这会引发很多问题(例如,如果进程同时运行,“同时视图”,如果不删除视图会发生什么,等等),如果您尝试类似的操作,请使用偏执级别的警告。