2011-07-19 49 views
0

我在更新表中的某些列值時遇到問題。在我的數據庫中有很多表格,我必須更新那些名稱爲「Col1」的列表。爲所選表應用sp_msforeachtable

如果我做

exec sp_msforeachtable 'UPDATE ? SET Col1= 

case when Col1 = "ppp" then "qqq" 
    when Col1 = "aaa" then "xxx" 
end 
' 

它會報告錯誤消息

消息207,級別16,狀態1,行1 無效列名 'COL1'。

怎麼辦?

+0

寫一個WHILE循環而不是使用sp_msforeachtable .... –

+1

爲什麼?做一些有用的東西,而不是試圖強迫某些東西。我不知道你對實時應用程序的參考是什麼? –

回答

2

如果你必須使用sp_msforeachtable你可以有條件地運行你的代碼根據你的列的存在。

exec sp_msforeachtable ' 
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMS WHERE COLUMN_NAME =''Col1'' AND TABLE_NAME = ''?'') 
BEGIN 
    UPDATE ? SET Col1= 

    case when Col1 = "ppp" then "qqq" 
    when Col1 = "aaa" then "xxx" 
    end 
END 
' 

或者,更好:

DECLARE @myScripts TABLE(
        id INT IDENTITY(1,1) PRIMARY KEY CLUSTERED, 
        sql VARCHAR(max) 
       ) 
DECLARE @max INT, 
     @i INT, 
     @SQL VARCHAR(MAX) 
INSERT INTO @myscripts(sql) 
SELECT 'UPDATE [' + tablename + '] SET Col1= 
     case when Col1 = "ppp" then "qqq" 
     when Col1 = "aaa" then "xxx" 
     end' 
    FROM [INFORMATION_SCHEMA].TABLES WHERE TABLE_NAME IN ('table1','table2','table3','table4') 
SELECT @max = @@ROWCOUNT, @i = 1 

WHILE @i <= @max 
BEGIN 
    SELECT @SQL = Script 
    FROM @myScripts 
    WHERE ID = @i 

    EXEC sp_executesql @statement = @SQL 
    SET @i = @i + 1 

END 
1
exec sp_msforeachtable 
    @command1= 
    ' 
    BEGIN 
     UPDATE ? SET Col1= 
      case when Col1 = "ppp" then "qqq" 
      when Col1 = "aaa" then "xxx" 
     END 
    END 
    ' 
    @whereand='AND o.id in (select object_id from sys.columns c where c.name=''Col1'')' 

的whereand將過濾什麼被髮送到命令,這樣你就可以執行命令自由地知道,只有表與Col1中會被引用。

相關問題