こんにちは、次のことを行う単純なストアド プロシージャを作成したいと思います。
疑似コード
@tempSelect = "SELECT * FROM Table"
if (@Param is NULL) then
exec @tempSelect
else
exec @tempSelect + ' WHERE id = ' + @Param + '
この方法は効果的ですか?ありがとうございました。
こんにちは、次のことを行う単純なストアド プロシージャを作成したいと思います。
疑似コード
@tempSelect = "SELECT * FROM Table"
if (@Param is NULL) then
exec @tempSelect
else
exec @tempSelect + ' WHERE id = ' + @Param + '
この方法は効果的ですか?ありがとうございました。
試す
select *
from table
where id=isnull(@param, id)
Select * from Table Where (ID = @Param または @Param が null)
または
Select * from Table Where ID=Coalesce(@Param, ID)
[そして、効率化を目指している場合は、* を返したい特定のフィールドに置き換えてください。]
場合によっては、おそらく動的 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 ソリューションを避けます。OR を使用して生成されたクエリ プランと、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='''+@Param1
end
EXEC(@resultSet)
END