2016-11-22 7 views
0

私はSQL Serverのストアドプロシージャを持っています私はそれがパラメータを渡すときにすべてのレコードを返したい場合は、最小値と最大値を設定して実行します。SQL Serverのストアドプロシージャのパラメータの戻り値のすべてのレコードがない場合は、関数に渡すパラメータ

alter PROCEDURE SearchBYProjects 
@location NVARCHAR(50), 
@purpose NVARCHAR(50), 
@type NVARCHAR(50), 
@min NVARCHAR(50), 
@max NVARCHAR(50) 
AS 
SELECT 
    p.ID, 
    p.ProjectName, 
    p.Areas, 
    p.PaymentSystem, 
    p.ReceivedDate,  
    p.PropertyClassification, 
    p.ProjectImage,   
    l.LocationName, 
    Pur.PurposeName,    
    t.TypeName 
FROM dbo.Projects AS p 
LEFT JOIN dbo.Locations AS l ON p.LocationID = l.ID  
LEFT JOIN dbo.Purpose pur ON p.PurposeID = pur.ID 
LEFT JOIN dbo.[Types] AS t ON p.TypeID = t.ID 
WHERE UPPER(ISNULL(l.LocationName,N'')) LIKE N'%' + UPPER(@location) + '%' 
AND UPPER(ISNULL(pur.PurposeName,N'')) LIKE N'%' + UPPER(@purpose) + '%' 
AND UPPER(ISNULL(t.TypeName,N'')) LIKE N'%' + UPPER(@type) + '%' 
AND UPPER(ISNULL(p.Areas,'')) BETWEEN @min AND @max 
GO 

EXEC dbo.SearchBYProjects @location ='',@purpose='',@type='',@min='',@max='' 

助けてください。

答えて

1

多分この:この方法はまた、あなたには、いくつかのヌルではなく他の人などに合格できるようになることを

alter PROCEDURE SearchBYProjects 
    @location NVARCHAR(50) = null, 
    @purpose NVARCHAR(50) = null, 
    @type NVARCHAR(50) = null, 
    @min NVARCHAR(50) = null, 
    @max NVARCHAR(50) = null 
AS 
SELECT 
    p.ID, 
    p.ProjectName, 
    p.Areas, 
    p.PaymentSystem, 
    p.ReceivedDate,  
    p.PropertyClassification, 
    p.ProjectImage,   
    l.LocationName, 
    Pur.PurposeName,    
    t.TypeName 
FROM dbo.Projects AS p 
LEFT JOIN dbo.Locations AS l ON p.LocationID = l.ID  
LEFT JOIN dbo.Purpose pur ON p.PurposeID = pur.ID 
LEFT JOIN dbo.[Types] AS t ON p.TypeID = t.ID 
WHERE (@location is null or UPPER(ISNULL(l.LocationName,N'')) LIKE N'%' + UPPER(@location) + '%') 
AND (@purpose is null or UPPER(ISNULL(pur.PurposeName,N'')) LIKE N'%' + UPPER(@purpose) + '%') 
AND (@type is null or UPPER(ISNULL(t.TypeName,N'')) LIKE N'%' + UPPER(@type) + '%') 
AND (@min is null or UPPER(ISNULL(p.Areas,'')) >= @min) 
AND (@max is null or UPPER(ISNULL(p.Areas,'')) <= @max) 
GO 

EXEC dbo.SearchBYProjects 

は注意

EXEC dbo.SearchBYProjects @type='SomeType' 

は、タイプ=「SomeType」ですべてを返します

「エリア」は、文字列の場合は、例えば、予想通り、これは機能しない可能性があることを言及する価値

'110'は '2'の前に、 '10'と '20'の間に来ます。したがって、これらが数値の場合は、where句でそれらを変換することができます。

+0

私はこのあなたはそれがすべてのレコードを返すようにパラメータを渡す必要があり、書き込みのパラメータとリターンのすべてのレコードがないとの手順を実行したい、私も同じように動作していないデータ型をintにnvarchar型から地域の列のデータ型を変更しましたパラメータを渡さないとすべてのレコードを返すのですか? – hashim

+0

この行はEXEC dbo.SearchBYProjects @location = ''、@ purpose = ''、@ type = ''、@ min = ''、@ max = ''を実行します。 – hashim

+1

これは動作しますが、影響。このタイプのキャッチすべてのクエリを改善する方法については、この記事をご覧ください。 http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/ –

2

のみ追加:

or coalesce(@location,@purpose,@type,@min,@max) is null 

あなたが検索引数に関数を使用しないようにしてください。 functionを(ISNULL、COALESCE、UPPER、udf ..)に使用すると、あなたの引数はもはやSARGではありません。それがnecasaryでない場合は、 '%dasda'のように使用しないでください。名前、場所、目的(または非構造化データ)に関する全文検索を使用してください。

1

SeanとDeadheep39が言ったすべてのこと。言っdeadsheep39に展開するには、あなたが句は次のようになりますWHERE:あなたはこのルートを行けば

WHERE 
( 
     UPPER(ISNULL(l.LocationName,N'')) LIKE N'%' + UPPER(@location) + '%' 
    AND UPPER(ISNULL(pur.PurposeName,N'')) LIKE N'%' + UPPER(@purpose) + '%' 
    AND UPPER(ISNULL(t.TypeName,N'')) LIKE N'%' + UPPER(@type) + '%' 
    AND UPPER(ISNULL(p.Areas,'')) BETWEEN @min AND @max 
) 
OR COALESCE(@location,@purpose,@type,@min,@max) IS NULL; 

ショーンが投稿記事を見て確認してください。

あなたは(これは私がそれを行うだろう方法です)また、あなたのprocの中にこのようなこの要件を扱うことができるストアドプロシージャでこれをやっているので:

IF COALESCE(@location,@purpose,@type,@min,@max) IS NULL 
    SELECT 
    p.ID, 
    p.ProjectName, 
    p.Areas, 
    p.PaymentSystem, 
    p.ReceivedDate,  
    p.PropertyClassification, 
    p.ProjectImage,   
    l.LocationName, 
    Pur.PurposeName,    
    t.TypeName 
    FROM dbo.Projects AS p 
    LEFT JOIN dbo.Locations AS l ON p.LocationID = l.ID  
    LEFT JOIN dbo.Purpose pur ON p.PurposeID = pur.ID 
    LEFT JOIN dbo.[Types] AS t ON p.TypeID = t.ID 
ELSE 
    SELECT 
    p.ID, 
    p.ProjectName, 
    p.Areas, 
    p.PaymentSystem, 
    p.ReceivedDate,  
    p.PropertyClassification, 
    p.ProjectImage,   
    l.LocationName, 
    Pur.PurposeName,    
    t.TypeName 
    FROM dbo.Projects AS p 
    LEFT JOIN dbo.Locations AS l ON p.LocationID = l.ID  
    LEFT JOIN dbo.Purpose pur ON p.PurposeID = pur.ID 
    LEFT JOIN dbo.[Types] AS t ON p.TypeID = t.ID 
    WHERE l.LocationName LIKE N'%' + @location + '%' 
    AND pur.PurposeName LIKE N'%' + @purpose + '%' 
    AND t.TypeName,N'')) LIKE N'%' @type + '%' 
    AND p.Areas BETWEEN @min AND @max; 

その後、PROCを実行するときには、いつも再コンパイルをしたいと思うでしょう。例:?

EXECUTE <your proc> WITH RECOMPILE; 
関連する問題