1

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

5 回答 5

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'))。

于 2009-09-09T16:22:20.090 回答
3

我不认为你可以使用这样的变量来做到这一点。您可以使用动态 SQL 进行更新:

DECLARE @sql VARCHAR(1000)

SET @sql = 'UPDATE' + @tableName + etc..

EXEC ( @sql )

只需在光标内执行此操作。

于 2009-09-09T16:21:18.687 回答
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
于 2009-09-09T16:28:06.500 回答
0

你试过 DECLARE @tblName varchar(50) 吗?我认为那会做到这一点。

于 2009-09-09T16:15:48.360 回答
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)'
于 2009-09-09T16:26:37.770 回答