嵌套SQL游标打印变量,但不会更新

时间:2017-07-22 13:40:13

标签: sql-server-2008 tsql variables cursor

我正在使用嵌套游标更新数据库每个表的第一列,以填充在线报告程序的数据。

使用print语句测试我的游标时,一切运行正常。当我切换到更新命令时,我得到一个错误,说必须定义变量@table。为什么变量仅适用于打印,如何使其正常工作?

declare @table varchar (30)
declare @Column varchar (30)

DECLARE [TABLE] CURSOR FOR SELECT TABLE_NAME FROM 
postfixing.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' order 
by table_name
OPEN [TABLE]
FETCH FROM [TABLE] INTO @TABLE
WHILE @@FETCH_STATUS=0
    BEGIN
    DECLARE [COLUMN] CURSOR FOR SELECT Top 1 Column_name FROM 
postfixing.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =@table order by 
column_name
    OPEN [COLUMN]
    FETCH FROM [COLUMN] INTO @COLUMN
    WHILE @@FETCH_STATUS=0
        BEGIN
        PRINT @TABLE+'   '+@COLUMN
        --UPDATE @TABLE SET @COLUMN=@COLUMN
        FETCH FROM [COLUMN] INTO @COLUMN
        END
    DEALLOCATE [COLUMN]
    FETCH FROM [TABLE] INTO @TABLE
END
DEALLOCATE [TABLE]

1 个答案:

答案 0 :(得分:1)

好吧,因为你只获得第一行,你可以消除嵌套游标,它应该做你想要的:

declare @table varchar (30)
declare @Column varchar (30)

DECLARE [TABLE] CURSOR FOR SELECT TABLE_NAME FROM 
postfixing.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' order 
by table_name
OPEN [TABLE]
FETCH FROM [TABLE] INTO @TABLE
WHILE @@FETCH_STATUS=0
    BEGIN

    SET @COLUMN = (SELECT Top 1 Column_name FROM 
postfixing.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =@table order by 
column_name)

    PRINT @TABLE+'   '+@COLUMN
    --UPDATE @TABLE SET @COLUMN=@COLUMN

FETCH FROM [TABLE] INTO @TABLE
END
CLOSE [TABLE]
DEALLOCATE [TABLE]