- PR -

Transact_SQLでの動的クエリの作成について

1
投稿者投稿内容
shearer1970
会議室デビュー日: 2007/08/24
投稿数: 4
投稿日時: 2007-08-30 17:31
初めて投稿させていただきます。よろしくお願いします。
SQLSERVER2000 SP2のテーブルにトリガを実装しようとしています。

変数@Retuで指定されたフィールドの値を@Ataiに挿入しようと、以下の
SQL文を実行しました。

Declare @Retu varchar(20),@Atai varchar(20)

SET @Retu='Col1' **@Retuに挿入されるフィールド名は実際は不定**

EXEC ( 'SELECT @Atai='+@Retu+'FROM TEST_Table
     WHERE Col2=''1000'' AND Col3=''2''')

すると、「変数@Ataiを宣言してください」とエラーが発生しました。

TEST_TableのCol2が1000、Col3が2のCol1フィールドには値が入っている
のは確認済みです。また「@Atai=」を削除して実行すれば、値を取得することも出来ます。

試しに@Ataiの前で文字列を区切って以下のSQL文で実行しても値は取得できませんでした。

 EXEC ( 'SELECT '+@Atai+'='+@Retu+'FROM TEST_Table
     WHERE Col2=''1000'' AND Col3=''2''')

変数にフィールド名を挿入してその値を得ることは出来ないのでしょうか?
ご教授ください。どうぞよろしくお願いします。
よっし〜。
ベテラン
会議室デビュー日: 2007/04/17
投稿数: 89
お住まい・勤務地: 北のほうの国
投稿日時: 2007-08-31 11:41
SELECT 文中の @Retu,@Atai はあくまで VARCHAR でしか定義されていませんので
列名を指定しているとは扱ってくれないと思います。
変数にセットしての指定はできないのでは?
(少なくとも私は知りません。)

@Retu に挿入するフィールド名がどのような条件で変化するかはわかりませんが
挿入するフィールド名の数の分だけSQL文を書けばいいのではないかと思います。

それに値をセットするのであれば"SELECT"ではなく"UPDATE"なのでは?
テスト用に記述しているだけでしょうか?

#スレッドはDatabase Expert のほうがいいのでは
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2007-08-31 12:44
@AtaiはEXECの中でしかスコープがないので無理かも。
EXEC ( 'Declare @Retu varchar(20),@Atai varchar(20) SET @Retu='Col1' SELECT @Atai='+@Retu+'FROM TEST_Table WHERE Col2=''1000'' AND Col3=''2''')
は通ると思いますが、これだと@Ataiを取り出せないので意味がないですよね。

動的SQLの中でテンポラリテーブルにInsertして、その後に@Ataiにセットするという
くらいしか思いつきませんでしたが、トリガの中ではいやですよね。
shearer1970
会議室デビュー日: 2007/08/24
投稿数: 4
投稿日時: 2007-08-31 13:49
よっし〜。さん、お返事ありがとうございます。

@Retuには、UPDATEされたフィールド名を取得します。
よっし〜さんのおっしゃるとおり、フィールド数だけSQL文というのが正しい
と思うのですが、データベースの作りに問題があり100フィールド以上が並んで
いるのです・・・。
データベース作り直すという案もあったのですが、1年ほどで新システムに移行する
予定との事で今回は見送ることになりました。

Transact_SQLでは

SELECT 変数=フィールド名 FROM テーブル名

で、フィールドの値を取得することが出来ます。また

EXEC ('SELECT '+ フィールド名を取得した変数 +'FROM テーブル名')

で、値を取得することもできるようなんですよね・・・

スレッドの件はご指摘のとおりたてる所を間違ってますね。ただ同じ内容の
スレッドを乱立させるわけにもいかず、また削除も基本的に出来ないという
ことなので、このままにしておきます。レスも付きましたし♪

もう少し考えて分からなければ、他の方法を探したいと思います。
ありがとうございました。
shearer1970
会議室デビュー日: 2007/08/24
投稿数: 4
投稿日時: 2007-08-31 15:55
すいません!よっしーさんとよっし〜。さんは別人ですね。
よっしーさん、ありがとうございます。

よっしーさんがおっしゃった方法で実現することにしました。
(テンポラリテーブルへのInsert)
自分の方法に固執して、実はそういう方法は気がついてませんでした。

まだまだ、初心者でなぜ@Ataiにデータが入ってこないのかその原因も、
よっしーさんのレスを読んで「なるほど!」と納得した次第です。

本当にありがとうございました。
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2007-08-31 16:03
shearer1970さん

こんにちは。

引用:

shearer1970さんの書き込み (2007-08-31 13:49) より:

SELECT 変数=フィールド名 FROM テーブル名
で、フィールドの値を取得することが出来ます。


これはOKですが、

引用:

EXEC ('SELECT '+ フィールド名を取得した変数 +'FROM テーブル名')
で、値を取得することもできるようなんですよね・・・


これももちろんできますが、取得した値をセットする変数はEXECの中の
文字列の中で宣言しないとエラーになりませんか?
で、文字列の中で宣言しても取り出せないので意味がないという意味でした。
(取り出せるようでしたらすみません。)

ちなみに、私とよっし〜。さんは別人です。。。似たハンドル名多いです。。
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2007-08-31 16:12
入れ違いになってしまいました。
一つ前の返信は無視してください。(消してもいいけど)

引用:

よっしーさんがおっしゃった方法で実現することにしました。
(テンポラリテーブルへのInsert)
自分の方法に固執して、実はそういう方法は気がついてませんでした。



私が思いついたのがこの方法というだけで、
他にもっといい方法があるかもしれませんよ。
パフォーマンス的に大丈夫ならこれで良いと思いますが。
shearer1970
会議室デビュー日: 2007/08/24
投稿数: 4
投稿日時: 2007-09-04 21:12
>よっしーさんへ

返信が遅れて申し訳ございません。
よっしーさんに教えていただいた方法でパフォーマンス的にも
問題なく動作しました。

あまり、熟知していない方法を時間が無い中で使うこと自体が
間違ってましたねw
ほんとうにありがとうございます!

また何かありましたら、どうぞよろしくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)