动态创建 SQL UPDATE 语句

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)

Ada*_*son 5

您尝试执行的操作称为“动态 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'))。