2017-11-02 23 views
0

私は2つのテーブル(tableAとtableB)に両方とも名前カラムを持っています。 tableAのnameカラムはNAMEと呼ばれ、tableBのカラムはFULLNAMEと呼ばれるかもしれませんが、どちらも同じ値を持つはずです。WHERE句でのカラム変数の使用

私は、これら2つの列の値が同じでないメンバID(いずれかのテーブルから)を取得するクエリを記述します。しかし、私はSSRSレポートに入ってくるので、私はパラメータを介してチェックしている列名を渡したいと思います。将来、私はこれらの2つのテーブルの間の他の列を比較するために使用できるようにしたいと思います。

このような何か:

DECLARE @COLUMN_A VARCHAR(50), @COLUMN_B VARCHAR(50) 

/* COLUMN PARAMS WILL BE PASSED IN VIA SSRS */ 

SELECT 
    DISTINCT(MEMBER_ID) 
FROM 
    TABLE_A 
JOIN TABLE_B 
    ON (TABLE_A.MEMBER_ID = TABLE_B.MEMBER_ID) 
WHERE 
    @COLUMN_A <> @COLUMN_B 

は、この可能性のようなものですか?

編集:

この作品のようなものがありますか?

DECLARE @column VARCHAR(50)

SELECT @column = 'FIRST_NAME'; 
SELECT DISTINCT 
    MEMBR_ID, 
    case  
     when @column='FIRST_NAME' then MEMBR_FIRST_NAME 
     when @column='LAST_NAME' then MEMBR_LAST_NAME 


    end TABLE_1, 
    case 
     when @column='FIRST_NAME' then FIRSTNAME 
     when @column='LAST_NAME' then LASTNAME 
    end TABLE_2, 
    @column 
FROM 
    TABLE_1 
JOIN TABLE_2 
    ON (TABLE_1.MEMBR_ID = TABLE_2.MEMBR_ID) 

WHERE 
    [email protected] <> [email protected] 
+0

の動的SQLを使用すると、@COLUMN_AをREPLACEしようとしている – Prisoner

答えて

0

は、この可能性のようなものですか?

技術的には、構文は問題ありません。 whereは2つの定数文字列を比較します。 2つの文字列が同じかどうかに応じて、結果はすべての行または行なしになります。

これらは列に評価されますか?いいえそうではありません。カラム名、テーブル名、スキーマ名、データベース名、関数名、演算子(たとえば)など、識別子のSQL文にパラメータを渡すことはできません。

あなたは、この使用して動的SQLを行うことができますが、あなたが名前を接続する必要があります。

DECLARE @sql NVARCHAR(MAX); 

SET @sql = ' 
SELECT DISTINCT A.MEMBER_ID 
FROM TABLE_A A JOIN 
    TABLE_B B 
    ON A.MEMBER_ID = B.MEMBER_ID 
WHERE [email protected]_A <> [email protected]_B 
'; 

SET @sql = REPLACE(@sql '@COLUMN_A', COLUMN_A); 
SET @sql = REPLACE(@sql '@COLUMN_B', COLUMN_B); 

exec sp_executesql @sql; 
+0

おかげで、それとの唯一の問題はあるあなたの友人で、 B、変数や実際の列名(3番目の引数)を有効な列名として認識していません... – Jim

+0

nevermind REPLACEの3番目の引数が文字列であると想定されています ありがとう – Jim

関連する問題