在庫システムのレポートを生成するクエリを実行しています。クエリには6つのパラメータがあり、そのうちの3つはオプションです。すべてのパラメータが入力されてもクエリは正常に動作しますが、1つまたは複数のオプションのパラメータが省略されている場合、クエリが正しく動作するようにはなりません。SQL LEFT JOINオプションのパラメータを使用したクエリのレポート
重要なパラメータは、@AccountNumber
,@Branch
,@Department
および@OrderBy
です。他の3つはオプションですが、@AccountNumber
パラメータが必要です。 @Branch
が省略された場合は、レポートにそのアカウントのすべての広告枠を表示したいと思います。同様に、@Department
が省略されていて、@Branch
が存在する場合は、そのアカウントのブランチにあるすべての広告枠を表示したいと思います。 3つのパラメータがすべて存在する場合、そのアカウントのブランチおよび部門内のすべてのインベントリが表示されます。 @OrderBy
が省略された場合、レポートはデフォルトでアカウントの昇順で在庫を注文します。私が使用しているクエリは以下の通りです:
USE database;
GO
CREATE PROCEDURE RetrievedList
@AccountNumber int,
@Branch nvarchar(50),
@Department nvarchar(50),
@StartDate date,
@EndDate date,
@OrderBy nvarchar(10)
AS
IF @OrderBy = 'Locator'
BEGIN
SELECT [Container].[Acct] AS [Account]
...
FROM [File] LEFT JOIN [Container]
ON [File].[BoxID] = [Container].[BoxID]
WHERE [Container].[Acct] = @AccountNumber
AND [Container].[Branch] = @Branch
AND [Container].[Dept] = @Department
AND [File].[Out_Date] IS NOT NULL
AND [File].[Out_Date] BETWEEN @StartDate AND @EndDate
ORDER BY [Container].[Loc];
END
ELSE IF @OrderBy = 'Title'
BEGIN
SELECT [Container].[Acct] AS [Account]
...
FROM [File] LEFT JOIN [Container]
ON [File].[BoxID] = [Container].[BoxID]
WHERE [Container].[Acct] = @AccountNumber
AND [Container].[Branch] = @Branch
AND [Container].[Dept] = @Department
AND [File].[Out_Date] IS NOT NULL
AND [File].[Out_Date] BETWEEN @StartDate AND @EndDate
ORDER BY [File].[Title1];
END
ELSE
BEGIN
SELECT [Container].[Acct] AS [Account]
...
FROM [File] LEFT JOIN [Container]
ON [File].[BoxID] = [Container].[BoxID]
WHERE [Container].[Acct] = @AccountNumber
AND [Container].[Branch] = @Branch
AND [Container].[Dept] = @Department
AND [File].[Out_Date] IS NOT NULL
AND [File].[Out_Date] BETWEEN @StartDate AND @EndDate
ORDER BY [Container].[Acct], [Container].[Branch], [Container].[Dept], [Container].[BoxNo], [File].[Title1];
END
GO
私は理由LEFT JOIN
のWHERE [Container].[Branch] = @Branch OR [Container].[Branch] = NULL
アプローチを使用することはできませんことを覚えておいてください。予想されるレコードの6倍を返します。
一つの選択肢は、動的SQLを使用することで、 – techspider
この記事はを参照してください。そのフィールドに値がある場合は、必要なフィールドを連結しますいくつかの方法に入りますoこのタイプのクエリを解決し、高いレベルのパフォーマンスを維持します。 http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/ –