質問

いテーブルの分野です。私が作り出してしまおうというもの検索フィルター asp.net したがって、ユーザが検索できる一つ又は組み合わせます。のではないでしょうかをしたいと思っている単一の保存の手続きを取るとき4のパラメータが追加されましparamは、WHERE節がnullでない場合...

TableExample4カラムCol1Col2Col3Col4

したいと思っていないということを単一の保存の手続きを行なっていをひとつひとつにつき組み合わせです。

って思ったことは、正確とはいえないが、そうしだけることができました。

よろしく!

CREATE PROCEDURE [dbo].[Search]
    @Col1 int,
    @Col2 int,
    @Col3 int,
    @Col4 int
AS

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

SELECT *

FROM
    [dbo].[TestTable]
WHERE
    1=1
    CASE        
        WHEN @Col1 IN NOT NULL
        THEN AND [Col1] = @Col1

        WHEN @Col2 IN NOT NULL
        THEN AND [Col2] = @Col2

        WHEN @Col3 IN NOT NULL
        THEN AND [Col3] = @Col3

        WHEN @Col4 IN NOT NULL
        THEN AND [Col4] = @Col4
    END
役に立ちましたか?

解決 5

私はあなたの回答ありがとうございました。しかし、私は少し違っそれをやりました。私はそれが誰かを役に立てば幸い!ここで私はそれについていった方法は次のとおりです。

CREATE PROCEDURE [dbo].[TestTable_Search]
    @Col1 int,
    @Col2 uniqueidentifier,
    @Col3 datetime,
    @Col4 datetime
AS

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

SELECT *

FROM
    [dbo].[TestTable]
WHERE
    [Col1] = COALESCE(@Col1, Col1) AND
    [Col2] = COALESCE(@Col2, Col2) AND
    [Col3] >= COALESCE(@Col3 + "00:00:00", Col3) AND
    [Col4] <= COALESCE(@Col4 + "23:59:59", Col4)

他のヒント

という事実OR短絡を使用してください。私が想定してきた-1有効な値ではありません。

CREATE PROCEDURE [dbo].[Search]
    @Col1 int = -1,
    @Col2 int = -1,
    @Col3 int = -1,
    @Col4 int = -1
AS
Begin
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

SELECT *

FROM
    [dbo].[TestTable]
WHERE
 (@Col1 = -1 OR [Col1] = @Col1)
and
(@Col2 = -1 OR [Col2] = @Col2)
and
(@Col3 = -1 OR [Col3] = @Col3)
and
(@Col4 = -1 OR [Col4] = @Col4)



END

の検索は、私はどちらかの動的SQLを使用するか、コード内であなたのSQL文字列を構築説くまれな選択肢の一つです。あなたはすべてのSPROC環境を持っている場合は、あなたのSPROCで動的SQLを使用しています。

SQLインジェクションを防ぐために、それをパラメータ化し、それを実行するためにsp_executesqlをを使用

あなたが持っているものと同様の方法でそれを行うことができます:

WHERE
  CASE
    WHEN @Col1 IS NULL THEN true
    ELSE [Col1] = @Col1
  END
AND
  CASE
    WHEN @Col2 IS NULL THEN true
    ELSE [Col2] = @Col2
  END
...

それとも、おそらく読みにくくものの、それがずっと簡単にすることができます:

WHERE (@Col1 IS NULL OR [Col1] = @Col1])
  AND (@Col2 IS NULL OR [Col2] = @Col2])
  AND ...

いす使用の動的SQLい:

CREATE PROCEDURE [dbo].[Search]
    @Col1 int,
    @Col2 int,
    @Col3 int,
    @Col4 int
AS

DECLARE @SQL nvarchar(MAX)

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

SET @SQL = 'SELECT * 
              FROM [dbo].[TestTable]
             WHERE 1=1 '

IF @Col1 IS NOT NULL
SET @SQL = @SQL + ' AND Col1 = ''' + @Col1 + ''' '

IF @Col2 IS NOT NULL
SET @SQL = @SQL + ' AND Col2 = ''' + @Col2 + ''' '

IF @Col3 IS NOT NULL
SET @SQL = @SQL + ' AND Col3 = ''' + @Col3 + ''' '

IF @Col4 IS NOT NULL
SET @SQL = @SQL + ' AND Col4 = ''' + @Col4 + ''' '

exec sp_executesql @SQL

END

いれてくる危険性もあることを含むSQLインジェクションなどのアクセス権の問題で生じうる、といった動SQLで、このデータベース。ビルドする場合のご照会のためのアプリケーションレイヤ(C#)までにおけるSQLインジェクション攻撃もあります。

一部の動的SQLれのあるリンク行為をご理解いただくためには、欠点:

http://www.sommarskog.se/dynamic_sql.html http://slashstar.com/blogs/tim/archive/2006/10/12/The-Prevalence-and-Dangers-of-SQL-Injection.aspx

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top