2011-07-19 1 views
0

テーブルの一部の列の値を更新する際に問題があります。私のデータベースには多くのテーブルがあり、そのうちの1つのテーブルには "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

sp_msforeachtableを使用する代わりにWHILEループを作成します.... –

+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とテーブルのみがすることを知ってコマンドを実行することができるように、コマンドに送信されます何をフィルタリングします参照される。

関連する問題