2009-03-18 28 views
1

こんにちは、私は次の処理を行い、簡単な保存proecudreを作成したい:SQL:条件付きリターン

Psudocode

@tempSelect = "SELECT * FROM Table" 

if (@Param is NULL) then 
exec @tempSelect 
else 
exec @tempSelect + ' WHERE id = ' + @Param + ' 

このメソッドefficentですか?ありがとうございました。

答えて

10

表 (ID = @Paramまたは@Paramがnull)

それとも

選択*表 ID =合体(@Paramからから

select * 
from table 
where id=isnull(@param, id) 
+0

おかげで、私はより良い方法があることを知っていました。 – DavidS

+0

+1巨大なデータセットで作業していない限り、わかりやすくわかりやすい(私があなたがすべてを返すなら、あなたが望んでいないことを願っています)。 –

+1

このソリューションでは、ID列のインデックスが使用されないため、パフォーマンスの問題が発生する可能性があります。あなたのDBについてはわかりませんが、オラクルのNVL機能の場合は確信しています。 – dub

1

選択*をお試しください、ID)

[効率を目指している場合は、*を返す特定のフィールドに置き換えてください。]

0

はい - 私は間違いがないと確信しています。あなたはそれをさらに簡単にすることができます:

Set NOCOUNT On; 
if (@Param is NULL) 
    Select * From Table; 
else 
    Select * From Table Where ([email protected]); 

注:私はおそらくフィールドを綴るでしょう。

0

場合によっては、おそらく動的SQLを使用します。

しかし、@paramがユーザに由来する場合、SQLインジェクションについて覚えておく必要があります。つまり、SQLに直接パラメータを追加しないでください。 T-SQL、それは次のようになりますで

(私の頭や未検証の外に;):

DECLARE @SQL NVARCHAR(MAX) 

SET @SQL = N' 
    SELECT ... 
    FROM table t 
    WHERE 1 = 1' (

IF(@param IS NOT NULL) 
    SET @SQL = @SQL + ' 
    AND t.id = @id' 

... possibly more things added to the query ... 

EXEC sp_executesql 
    @SQL 
, '@id AS INT' 
, @id = @Param 

は、これを行うことにより、あなたは、sp_executesqlをを使用して、各ケースのための最適化されたクエリプランを取得(となりますクエリキャッシュも使用されます)

ORを使用して生成されたクエリプランをチェックすると、その理由がわかります。

0

は、このコードを試してみてください。

CREATE PROCEDURE [dbo].[ProcedureName] 
@Param varchar(50) 

AS 
BEGIN 

declare @tempSelect nvarchar(max) 

SET NOCOUNT ON; 

set @tempSelect = 'SELECT Col1, Col2 FROM Table where Col1 <> '' ' 

     if @Param <> '' 
    begin 
    set @resultSet = @resultSet + ''' and Col1='''[email protected] 
    end 


EXEC(@resultSet) 

END