也许有更好的方法,但这必须有点动态。
从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
答案 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列名称的变量。