0

ヘラーみんな、

私がやりたいのはそのようなことです。パラメータに応じてSQLテーブルを作成します。

DECLARE @find varchar(30)
SET @find = 'no'

SELECT * FROM
(

    if @find = 'yes'
    (
    SELECT * FROM myTable
    WHERE ID= '5882'
    )
    ELSE
    (
    SELECT * FROM myTable
    WHERE OLD_ID= '5882'
    )   

) X

これは例として挙げた単純なテーブルです。実際のSQLクエリははるかに大きいため、このクエリ内で動的SQLを使用できるとは思いません。だから私は他の方法が必要です。

4

3 に答える 3

1

次のように「検索CASE機能」を使用します。

WHERE
    CASE 
         WHEN @find = 'no' THEN ID
         WHEN @find = 'yes' THEN OLD_ID
         -- put an ELSE clause here
         -- if you want to catch @find not being no or yes
    END 
    = '5882'
于 2010-02-15T10:12:53.430 に答える
0

EXEC を使用して SQL 文字列を実行できます。引用符を気にする必要があります。

DECLARE @column varchar(max);
SET @column = 'OLD_ID'

EXEC('SELECT * FROM myTable WHERE ' + @column + ' = ''5882''')
于 2010-02-15T10:06:32.640 に答える
0

最適な実行計画を確保するために、個別のクエリを作成し、「@find」に応じて適切なクエリを呼び出すことをお勧めします。たとえば、SPROC1 は ID を照会します SPROC2 は OLD_ID を照会します

次に、呼び出しコードを変更して適切な sproc を呼び出すか、または @find をパラメーターとして渡すだけの場合は、リダイレクトとして機能する 3 番目の sproc を作成します: SPROC3:

IF (@find = 'no')
    EXECUTE SPROC1
ELSE IF (@find = 'yes')
    EXECUTE SPROC2
ELSE
    ....

他のアプローチのリスクは、実行計画汚染であり、1 つのパス (例: @find='no') に対して計画が作成され、その後の呼び出しが @find='yes' で行われると、はるかに不適切な実行が使用されることになります。その結果、パフォーマンスが低下します。つまり、ID のインデックスを使用する代わりに、OLD_ID のインデックスを使用することになる可能性がありますが、これは明らかに理想的ではありません (逆もまた同様です)。

于 2010-02-15T10:31:56.223 に答える