0

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

从 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
4

1 回答 1

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 会使这变得更加混乱,而且我认为如果您想使用列名的变量。

于 2013-04-15T18:59:23.530 回答