2009-03-13 22 views
1

テーブルのリストをループしたいと思います。各テーブルについて、私は更新クエリを実行したいと思います。更新クエリでテーブルとフィールド名を動的に設定するにはどうすればよいですか?

擬コード:

ArrayOfTablesObjects = {['tablename1','fieldname1'],['tablename2','fieldname2']......} 

foreach @tablename in ArrayOfTablesObjects 

UPDATE @tablename 
SET @fieldname = 'xyz' 
WHERE @fieldname = '123' 

end foreach 

答えて

0

お返事ありがとうございます。私はそのアイデアを使用して、次のSQL文を作成しました。すべて同じタイプのデータ(従業員ID)を持っているが、そのフィールド名は異なるかもしれない多くのテーブル50+があります。したがって、テーブル名によっては更新するフィールドが異なります。私の実際のWHEREとSET文はこの例よりも複雑ですが、この問題には重要ではありません。

まず、更新したいテーブル/フィールドを格納する一時テーブルを作成します。

これらのレコードをループして、SQLを生成します。動的SQLが好きではない人は、print文を使って別のクエリウィンドウに貼り付けて実行することができます。または、EXECステートメントを呼び出すこともできます。

私はあなたの答えを受け入れたいと思いますが、自分自身について完全に説明しなかったので、私の質問には答えられませんでした。いずれにせよ、あなたの助けに感謝します。

DECLARE @TableFieldDictionary TABLE 
(
    tablename VARCHAR(100), 
    fieldname varchar(100) 
) 

insert into @TableFieldDictionary(tablename,fieldname) values ('table1','field1'); 
insert into @TableFieldDictionary(tablename,fieldname) values ('table2','field2'); 
--put more insert statements here. In my case, I have 50 inserts 


declare cursor_dictionary cursor 
for select tablename, fieldname from @TableFieldDictionary 

open cursor_dictionary 

declare @looptablename VARCHAR(100) 
declare @loopfieldname varchar(100) 

fetch next from cursor_dictionary 
into @looptablename,@loopfieldname 

DECLARE @UpdateSql AS varchar(max) 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @UpdateSql = 'UPDATE ' + @looptablename + 
        ' SET ' + @loopfieldname + ' = 123' + 
      ' WHERE ' + @loopfieldname + ' = 456' 

    print @updatesql 
    --EXEC(@updatesql) 

    fetch next from cursor_dictionary 
    into @looptablename,@loopfieldname 
END 

CLOSE cursor_dictionary 
DEALLOCATE cursor_dictionary 
2

あなたはこのために、動的SQLを使用する必要があります。 EXEC関数は、文字列として渡されるad-hoc sql文を実行します。

DECLARE @UpdateSql AS varchar(2000) 

foreach @tablename in ArrayOfTablesObjects 

SET @UpdateSql = 'UPDATE ' + @tablename + ' SET ' + @fieldname ' + = ''xyz'' WHERE ' + @fieldname + ' = ''123''' 
EXEC (@UpdateSql) 

end foreach 
+0

*笑い*レースはスウィフト(タイピスト)に見えます。 – MarkusQ

+0

実際、私はラップトップでブラウズしているときにこれを見ました。そこで私はどこにログインしたのですか(私のオープンIDはわかりません)。 – harpo

2

これは、動的SQLを使用してのみ行うことができます。これは非常に危険なテクニックであり、データベースにどのような悪影響を及ぼす可能性があるのか​​、そしてデータベースをより慎重に書くことができるのかについては、大いに考慮せずに決して行うべきではありません。動的SQLの作成を検討する前に、この記事をお読みください。 http://www.sommarskog.se/dynamic_sql.html

関連する問題