1

こんにちは、次のことを行う単純なストアド プロシージャを作成したいと思います。

疑似コード

@tempSelect = "SELECT * FROM Table"

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

この方法は効果的ですか?ありがとうございました。

4

5 に答える 5

10

試す

select *
from table
where id=isnull(@param, id)
于 2009-03-18T16:33:26.463 に答える
1

Select * from Table Where (ID = @Param または @Param が null)

または

Select * from Table Where ID=Coalesce(@Param, ID)

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

于 2009-03-18T16:34:11.610 に答える
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 ソリューションを避けます。OR を使用して生成されたクエリ プランと、OR を使用しないクエリ プランを比較すると、その理由がわかります。

于 2009-03-21T20:18:01.697 に答える
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='''+@Param1 
    end


EXEC(@resultSet)

END
于 2014-03-28T02:24:33.033 に答える