プロが教えるわが家の防犯対策術!

以下の内容の追加質問です。
http://oshiete.goo.ne.jp/qa/9224819.html
ご回答いただいた内容でデータの抽出がうまくできましたが、実はもう一つの悩みがあります。
テーブルT1とT2の列は可変です。
ユーザーの操作によって、列の添削ができますので、列を変数にしてさらに前回の回答に列の代わりに変数を使ってデータの抽出ができないでしょうか。
どうぞご教授をお願いします。

質問者からの補足コメント

  • つらい・・・

    次のようにためしてみたが、「列名があいまい」というエラーで実行できませんでした。
    おわかりの方がいらっしゃればご教授をお願いします。

    Declare @preDataCol nvarchar(40)
    Declare @afterDataCol nvarchar(40)
    SET @cnt = 2
    SELECT @colName = COL_NAME(OBJECT_ID('T1'), @cnt)
    SELECT @preDataCol = 'T1.' + @colName
    SELECT @afterDataCol = 'T2.' + @colName

      補足日時:2016/03/29 16:50
  • つらい・・・


    EXEC (
    ' SELECT ' +
    @colName + ' AS ColumnName ' +
    ', ' + @preDataCol + ' AS PreData ' +
    ', ' + @afterDataCol + ' AS AfterData ' +

    ' FROM T1 , T2 ' +
    ' WHERE T1.BusinessName = T2.BusinessName ' +
    ' AND ' + @preDataCol + ' <> ' + @afterDataCol
    )

      補足日時:2016/03/29 16:51
  • 文字型にする問題が自己解決したので質問をクローズします。アドバイスをいただいたkmee様に感謝します。

    No.2の回答に寄せられた補足コメントです。 補足日時:2016/03/31 17:58
教えて!goo グレード

A 回答 (2件)

デバッグ実行とか、プロファイラとかで ②の EXECでどんなSQLを実行しているか、確認してはどうです?



@colNameが COL だったとすると
@preDataColはT1.COL
@postDataColはT2.COL
になって、②のSQLが

SELECT
COL As ColumnName,
T1.COL AS PreData,
T2.COL AS AfterData
FROM T1,T2
WHERE T1.BusinessName = T2.BusinessName
AND T1.COL<>T2.COL

となる、ということは理解できてますか?
これだと COL As ColumnName のCOLがT1.COLとT2.COLの2つの候補があるので「曖昧」だ、ということは理解できますか?

「ColumnName」という名前から推測するに

SELECT
'COL' As ColumnName,
T1.COL AS PreData,
T2.COL AS AfterData
FROM T1,T2
WHERE T1.BusinessName = T2.BusinessName
AND T1.COL<>T2.COL

というSQLにするつもりだったのでは?




自分で書いといてなんですが
これって、SQLインジェクションの危険があります。
気を付けてください。

やはり、列名をユーザーが自由に変えられる、というのは問題だと思います。
この回答への補足あり
    • good
    • 0
この回答へのお礼

Kmee 様
おっしゃるどおり、
SELECT
'COL' As ColumnName,
T1.COL AS PreData,
T2.COL AS AfterData
FROM T1,T2
WHERE T1.BusinessName = T2.BusinessName
AND T1.COL<>T2.COL
のSQLにするつもりでした。
外部から列の添削について再度検討いたします。
ただ、列が変わらなくても、300以上の列があるので、
1つずつ、値を比較して結果をUNIONしていくにもあれなので、もう少しよみやすいクエリをしたく、
動的SQLを考えたんですが、躓いたわけです。
COLではなくて、'COL' にすれば、エラーが発生しないでしょうか。
変数の宣言はそもそも文字型なので、'COL' にする方法がわからないです。
大変恐縮ですが、ご教授いただけますでしょうか。

お礼日時:2016/03/30 12:13

> テーブルT1とT2の列は可変です。



まずは、そんなテーブル定義がしょっちゅう変化するような設計自体を変えるべきじゃないですかね?
テーブルの定義は Item1,Item2といった列名をそのままにして、
Item1 as ユーザーが変更した名前, Item2 as ユーザーが変更した名前2,..
となるビューを使うとか。



@c1='item1'
@c2='item1'
としたら、
@s = 'SELECT (以下略) と、前質問のSQLと同じ文字列になるようにして、
execute @s
で実行する、って方法はありますが。
    • good
    • 0
この回答へのお礼

Kmee 様
 教えていただいましてありがとうございます!
 ためしてみます。

お礼日時:2016/03/29 16:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

教えて!goo グレード

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング