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句を持つことができるのは素晴らしいことです。
前もって感謝します
代わりにこれを試してください:
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 ...
のようなものになります
のようなものを試してください
AND companies_SimpleList.CityId = @CityId or @CityID = 0
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) + '%'