SDC*_*SDC 1 sql t-sql sql-server cursors
我正在更新多个表中的数据。目前我有一个表,其中有一个字段“sources”,它只是包含字段“itemid”的所有表的列表。我还有一个包含 2 个字段的表,“itemid”和“olditemid”。在 TSQL 中,我想迭代源并动态创建更新语句。这是我试图做的,但我在更新语句中收到一些错误,表明我的变量未声明。我不确定这是否接近我应该这样做的正确方式。有想法吗?
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
Run Code Online (Sandbox Code Playgroud)
您尝试执行的操作称为“动态 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
Run Code Online (Sandbox Code Playgroud)
其作用是将更新查询转换为字符串,然后将该字符串中包含的 SQL 传递给sp_executesql存储过程(这是执行动态 sql 的推荐方法,而不是EXEC('foo'))。