20

SQL Server 2008 Expressを使用しており、SELECTパラメーターに基づいてfromテーブルを実行するストアドプロシージャがあります。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になります。これが私の問題です。ストアドプロシージャは0CityIdたとえば、この場合、間違った結果が返されます。したがって、intパラメーターの値が0より大きいかどうかに基づいて、動的なwhere句を使用できると便利です。

前もって感謝します

4

3 に答える 3

46

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

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 ...

于 2012-07-09T14:22:58.477 に答える
4

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

AND companies_SimpleList.CityId = @CityId or @CityID = 0
于 2012-07-09T14:21:30.943 に答える
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) + '%'
于 2014-08-24T16:07:17.990 に答える