- PR -

動的SQL文

投稿者投稿内容
なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2009-01-15 11:59
 こんにちは。
前回はありがとうございました。

もう1点、動的SQL文をお聞きします。

DECLARE @SYO AS char(1)
SET @SYO = 'B'
SELECT CASE WHEN @SYO = 'A' THEN 'OK' ELSE 'NO' END

を動的SQL文に変えたいので
DECLARE @SYO AS char(1)
SET @SYO = 'B'
EXEC(' SELECT CASE WHEN ' + @SYO + ' = ''A'' THEN ''OK'' ELSE ''NO'' END')

としました。

列名 'B' が無効です
となってしまいます。このような場合は
どのようにするのでしょうか?

宜しくお願いします。
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-01-15 12:17
ORACLE ですか?
FROM 句が無いですが。
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2009-01-15 12:35
シングルコーテーションが足りないだけでしょうが、
いずれにせよDBMS名やバージョンは明記して下さい。
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2009-01-15 13:02
EXEC(' SELECT CASE WHEN ' + @SYO + ' = ''A'' THEN ''OK'' ELSE ''NO'' END')

PRINT(' SELECT CASE WHEN ' + @SYO + ' = ''A'' THEN ''OK'' ELSE ''NO'' END')
とすれば、何が間違っているのかすぐにわかるはず。
なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2009-01-15 13:19
申し訳ありません。

SQLServer2005です。

早速、よっしーさんのを実行してみました。

結果は
SELECT CASE WHEN B = 'A' THEN 'OK' ELSE 'NO' END
です。

EXEC(' SELECT CASE WHEN @SYO = ''A'' THEN ''OK'' ELSE ''NO'' END')
と変更してみましたが
スカラ変数 "@SYO" を宣言してください。
のエラーになってしまいます。

EXEC('
DECLARE @SYO AS char(1)
SET @SYO = ''B''
SELECT CASE WHEN @SYO = ''A'' THEN ''OK'' ELSE ''NO'' END')
ではOKですが。

どうしても変数は外にしたいのです。

すいません、どのように書くのでしょうか?
宜しくお願いします。

King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-01-15 13:28
どういう SQL を作成したいかという方向から考えていけばどうですか?
作りたい SQL は

SELECT CASE WHEN B = 'A' THEN 'OK' ELSE 'NO' END

じゃないですよね?
なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2009-01-15 13:32
Kingさん、ありがとうございます。

作りたいSQL文は
SELECT CASE WHEN ' + @SYO + ' = ''A'' THEN ''OK'' ELSE ''NO'' END'
です。
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-01-15 13:43
Kingさんがおっしゃっているのは

「結果的にどういうSQL文になってほしいか」。
ということだと思います。

' SELECT CASE WHEN ' + @SYO + ' = ''A'' THEN ''OK'' ELSE ''NO'' END'
は、@SYOにBがSETされているとき、結果的に
SELECT CASE WHEN B = 'A' THEN 'OK' ELSE 'NO' END
というSQL文になります。(PRINTで確認したように)

なびさんとしては、本当はどのようなSQL文になってほしかったですか?

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