web-dev-qa-db-ja.com

ストアドプロシージャで動的なWHERE句を作成する

SQL Server 2008 Expressを使用していますが、パラメーターに基づいて、テーブルからSELECTを実行するストアドプロシージャがあります。 nvarcharパラメータとintパラメータがあります。

これが私の問題です。私のwhere句は次のようになります。

WHERE [companies_SimpleList].[Description] Like @What 
    AND companies_SimpleList.Keywords Like @Keywords
    AND companies_SimpleList.FullAdress Like @Where
    AND companies_SimpleList.ActivityId = @ActivityId
    AND companies_SimpleList.DepartementId = @DepartementId
    AND companies_SimpleList.CityId = @CityId

このパラメーターは、ASP.NET MVC 3アプリケーションのユーザーによって設定されたフィルター値であり、intパラメーターが設定されていない可能性があるため、それらの値は0になります。これが私の問題です。ストアドプロシージャが検索します0として、たとえばCityIdを使用すると、誤った結果が返されます。したがって、intパラメータの値が0より大きいかどうかに基づいて、動的なwhere句を持つことができるのは素晴らしいことです。

前もって感謝します

17
SidAhmed

代わりにこれを試してください:

WHERE 1 = 1
AND (@what     IS NULL OR [companies_SimpleList].[Description] Like @What )
AND (@keywords IS NULL OR companies_SimpleList.Keywords        Like @Keywords)
AND (@where    IS NULL OR companies_SimpleList.FullAdress      Like @Where)
...

パラメータ@what@whereのいずれかがNULL値とともにストアドプロシージャに送信された場合、条件は無視されます。テスト値としてnullの代わりに0を使用できます。それは@what = 0 OR ...のようなものになります

38
Mahmoud Gamal

のようなものを試してください

AND companies_SimpleList.CityId = @CityId or @CityID = 0
4
Tony Hopkinson

SQL Server> = 2008のもう1つの読みやすいソリューションを次に示します

CREATE PROCEDURE FindEmployee
    @Id INT = NULL,
    @SecondName NVARCHAR(MAX) = NULL
AS 
    SELECT  Employees.Id AS "Id",
            Employees.FirstName AS "FirstName",
            Employees.SecondName AS "SecondName"
    FROM Employees
    WHERE Employees.Id = COALESCE(@Id, Employees.Id)
    AND Employees.SecondName LIKE COALESCE(@SecondName, Employees.SecondName) + '%'
0
Mario Eis