动态创建SQL UPDATE语句

时间:2009-09-09 16:12:28

标签: sql sql-server tsql cursors

我正在更新多个表中的数据。目前我有一个表有一个字段“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

5 个答案:

答案 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)

你尝试过吗? DECLARE @tblName varchar(50)? 我认为会这样做。

答案 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)'