嵌套 SQL 游标打印变量,但不会更新
Nested SQL cursor prints variable, but will not update
我正在使用嵌套游标来更新我数据库中每个 table 的第一列,以填充在线报告程序的数据。
当使用 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]
因为你只得到第一行,你可以消除嵌套游标,它应该做你想做的事:
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]
我正在使用嵌套游标来更新我数据库中每个 table 的第一列,以填充在线报告程序的数据。
当使用 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]
因为你只得到第一行,你可以消除嵌套游标,它应该做你想做的事:
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]