我正在更新多个表中的数据。目前我有一个表有一个字段“sources”,它只是包含字段“itemid”的所有表的列表。我还有一个包含2个字段的表,“itemid”和“olditemid”。在TSQL中,我想迭代源代码并动态创建更新语句。这是我试图做的,但我在update语句中得到一些错误,我的变量未声明。我不确定这是否接近我应该这样做的正确方法。想法?
DECLARE @tblName varchar(50)
DECLARE process_cursor CURSOR FOR
SELECT source
FROM tmpTableNames
OPEN process_cursor
FETCH NEXT FROM processcursor
INTO @tblName
WHILE @@FETCH_STATUS = 0
UPDATE @tblName
SET itemid = r.itemid
FROM @tblName v, itemref r
WHERE r.olditemid = v.itemid
FETCH NEXT FROM process_cursor
INTO @tblName
END
CLOSE processcursor
DEALLOCATE processcursor
答案 0 :(得分:4)
您要做的事情被称为“动态SQL”。当你走在正确的轨道上时,你不能简单地用变量代替对象名称并执行查询。我会把动态SQL的陷阱留给别人。您正在寻找的是:
DECLARE @tblName varchar(50)
DECLARE process_cursor CURSOR FOR
SELECT source
FROM tmpTableNames
OPEN process_cursor
FETCH NEXT FROM processcursor
INTO @tblName
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @sql NVARCHAR(500)
SELECT @sql = 'UPDATE [' + @tbleName + '] SET itemid = r.itemid FROM [' + @tbleName + '] v, itemref r WHERE r.ilditemid = v.itemid'
EXEC sp_executesql @sql
FETCH NEXT FROM process_cursor
INTO @tblName
END
CLOSE processcursor
DEALLOCATE processcursor
这样做是将更新查询转换为字符串,然后将该字符串中包含的SQL传递给sp_executesql
存储过程(这是执行动态sql的推荐方法,而不是EXEC('foo')
)。
答案 1 :(得分:3)
我不认为你可以使用这样的变量来做到这一点。您可以使用动态SQL进行更新:
DECLARE @sql VARCHAR(1000)
SET @sql = 'UPDATE' + @tableName + etc..
EXEC ( @sql )
只需在光标内执行此操作。
答案 2 :(得分:1)
你不能像这样动态执行sql - 你需要将动态生成的字符串传递给exec函数,如下所示:
DECLARE @tblName varchar(50)
DECLARE process_cursor CURSOR FOR
SELECT source
FROM tmpTableNames
OPEN process_cursor
FETCH NEXT FROM processcursor
INTO @tblName
WHILE @@FETCH_STATUS = 0
Declare @sql varchar(5000)
Select @sql = 'UPDATE ' + @tblName +
'SET itemid = r.itemid
FROM ' + @tblName + ' v, itemref r
WHERE r.olditemid = v.itemid'
Exec @sql
FETCH NEXT FROM process_cursor
INTO @tblName
END
CLOSE processcursor
DEALLOCATE processcursor
答案 3 :(得分:0)
答案 4 :(得分:0)
我从未成功使用基于变量的UPDATE语句(即UPDATE @tblName),除非我将它们捕获到字符串中并动态执行,如:
EXEC 'UPDATE ' + @tblName + '
SET ItemId = (SELECT r.ItemId FROM itemref r WHERE r.OldItemId = ' + @tblName + '.itemId)'
对于表格TheTable,这应扩展为:
EXEC 'UPDATE TheTable
SET ItemId = (SELECT r.ItemId FROM itemref r WHERE r.OldItemId = TheTable.ItemId)'