SQL Server 2008:用于检索和替换数据的游标

时间:2013-04-15 18:40:50

标签: sql sql-server-2008 cursor

也许有更好的方法,但这必须有点动态。

从vb.net表单我需要将数据从一个表恢复或替换到另一个表。除了几个不同的列之外,这两个表是相同的。

首先我写了一些SQL来获取传入的表的列名。然后通过序号位置我只得到我想要的值的表。我将这些表名存储在临时表中。

现在我想使用临时表列名从备份表中获取这些值,并将它们放在主表中。

所以我想我想我需要一个光标以某种方式循环...我从大学开始就没有碰过光标而哇。

我会让自己难堪并发布我当前的代码。

SET @getColCURSOR = CURSOR FOR 
    SELECT name
    FROM #MyTempTable --created previously as table only holding column names

OPEN @getColCURSOR
FETCH NEXT FROM @getColCURSOR 
INTO @columnName 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    select @columnName --this variable should as a column name and change 
    from AUDIT_TABLE a where a.ID = 7 -- 7 is just for testing is dynamic variable
  FETCH NEXT FROM @getColCURSOR 
INTO @columnName 
END 

CLOSE @getColCURSOR 
DEALLOCATE @getColCURSOR

1 个答案:

答案 0 :(得分:2)

我不打算评论是否可以在没有光标的情况下完成这项工作,因为我对你要做的事情有点失落。但是光标的一个问题是您无法在select语句中参数化列名。所以你需要替换它:

WHILE @@FETCH_STATUS = 0 
BEGIN 
    select @columnName --this variable should as a column name and change 
    from AUDIT_TABLE a where a.ID = 7 -- 7 is just for testing is dynamic variable
  FETCH NEXT FROM getColCURSOR 
INTO @columnName 
END 

- 使用动态SQL,如下所示:

DECLARE @SQL nvarchar(max)

WHILE @@FETCH_STATUS = 0 
BEGIN 
    set @SQL =
      N'select ' + QUOTENAME(@columnName) + ' from AUDIT_TABLE a where a.ID = 7'
    EXEC (@SQL); --w/o brackets assumes you've calling a stored proc
  FETCH NEXT FROM getColCURSOR 
INTO @columnName 
END 

这可能会引入其他问题,因为动态SQL语句在自己的范围内执行。我绝对鼓励你研究是否有一个基于集合的解决方案,因为使用动态SQL会使这更加混乱,如果你想使用一个,我认为你不能逃脱动态SQL列名称的变量。