こんにちは、私は次の処理を行い、簡単な保存proecudreを作成したい:SQL:条件付きリターン
Psudocode
@tempSelect = "SELECT * FROM Table"
if (@Param is NULL) then
exec @tempSelect
else
exec @tempSelect + ' WHERE id = ' + @Param + '
このメソッドefficentですか?ありがとうございました。
こんにちは、私は次の処理を行い、簡単な保存proecudreを作成したい:SQL:条件付きリターン
Psudocode
@tempSelect = "SELECT * FROM Table"
if (@Param is NULL) then
exec @tempSelect
else
exec @tempSelect + ' WHERE id = ' + @Param + '
このメソッドefficentですか?ありがとうございました。
表 (ID = @Paramまたは@Paramがnull)
それとも
選択*表 ID =合体(@Paramからから
select *
from table
where id=isnull(@param, id)
選択*をお試しください、ID)
[効率を目指している場合は、*を返す特定のフィールドに置き換えてください。]
はい - 私は間違いがないと確信しています。あなたはそれをさらに簡単にすることができます:
Set NOCOUNT On;
if (@Param is NULL)
Select * From Table;
else
Select * From Table Where ([email protected]);
注:私はおそらくフィールドを綴るでしょう。
場合によっては、おそらく動的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を使用して生成されたクエリプランをチェックすると、その理由がわかります。
は、このコードを試してみてください。
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
おかげで、私はより良い方法があることを知っていました。 – DavidS
+1巨大なデータセットで作業していない限り、わかりやすくわかりやすい(私があなたがすべてを返すなら、あなたが望んでいないことを願っています)。 –
このソリューションでは、ID列のインデックスが使用されないため、パフォーマンスの問題が発生する可能性があります。あなたのDBについてはわかりませんが、オラクルのNVL機能の場合は確信しています。 – dub