これは私が正しく説明するのが少し難しいので、ご容赦ください。
ユーザーがクエリ用に作成しているさまざまなパラメーターのデータを入力できるように、動的 SQL クエリを作成しようとしています。すべてのパラメーターが入力されている場合は実行していますが、これらのパラメーターの 1 つまたはいずれかが null 値を許可し、他のパラメーターに基づいてデータを返す方法がわかりません。たとえば、以下のクエリ情報を使用して、@Client パラメーターを NULL に設定すると、1 つのクライアントを指定するのではなく、すべてのクライアントに対して同じ情報が返されます。日付フィールドを除く他のすべてのパラメーターに対して同様の関数が必要です。これらは常に必要になるためです。
null 値を許可したい理由は、このクエリの最終結果です。VS 2010 で Telerik を使用してレポートを作成しています。これは、会社が使用するために展開されます。telerik では、実行時にパラメーターを null にすることができます。目標は、このレポートをさまざまな状況で役立つようにすることです。基本的には、来年中に 100 の異なるクエリを作成する必要がなくなり、ユーザーが必要なものをより詳細に制御/アクセスできるようにすることです。
これはSQLで可能ですか?
ここに私が今持っているものがあります:
DECLARE @Product int
DECLARE @OrderDate1 datetime
DECLARE @OrderDate2 datetime
DECLARE @Status int
DECLARE @Queue int
DECLARE @Client int
SET @Product = 86
SET @OrderDate1 = '2012-09-01'
SET @OrderDate2 = '2012-11-30'
SET @Status = 80
SET @Queue = 0
SET @Client = 56156
SELECT
CAST(oi.OrderID AS VARCHAR(MAX))+'.'+CAST(oi.OrderItemID AS VARCHAR(MAX)) AS OrderNumber
,CASE WHEN p.Abbreviation IS NULL THEN NULL
ELSE p.Abbreviation END AS Product
,o.OrderDate
,v.ContactFirstName+' '+v.ContactLastName AS Vendor
,m.Description AS Status
,q.Description AS Queue
FROM
OrderItems oi
JOIN Orders o (NOLOCK) ON o.OrderID = oi.OrderID
JOIN Products p (NOLOCK) ON p.ProductID = oi.ProductID
JOIN Vendors v (NOLOCK) ON v.VendorID = oi.VendorID
JOIN Milestones m (NOLOCK) ON m.MilestoneID = oi.LastMilestoneID
JOIN Queues q (NOLOCK) ON q.QueueID = oi.QueueID
WHERE
oi.ProductID in (@Product)
and o.OrderDate BETWEEN @OrderDate1 and DATEADD(DD, 1, @OrderDate2)
and oi.LastMilestoneID in (@Status)
and oi.QueueID in (@Queue)
and o.ClientID in (@Client)
DDL:
CREATE TABLE OrderItems
(
OrderID int,
OrderItemID int,
ProductID int,
VendorID int,
LastMilestoneID int,
QueueID int
)
insert into OrderItems
Values(1234567, 1, 86, 105111, 80, 0)
CREATE TABLE Orders
(
OrderID int,
ClientID int,
OrderDate datetime
)
insert into orders
Values(1234567, 56156, '2012-11-08')
CREATE TABLE Products
(
ProductID int,
Abbreviation Varchar(20),
)
insert into products
Values(86, 'Product1')
CREATE TABLE Vendors
(
VendorID int,
ContactFirstName Varchar(20),
ContactLastName Varchar(20)
)
insert into vendors
Values(105111, 'john', 'doe')
CREATE TABLE Milestones
(
MilestoneID int,
Description Varchar(20)
)
insert into milestones
values(80, 'Status 1')
CREATE TABLE Queues
(
QueueID int,
Description Varchar(20)
)
insert into Queues
values(0, 'Queue1')