0

これは私が正しく説明するのが少し難しいので、ご容赦ください。

ユーザーがクエリ用に作成しているさまざまなパラメーターのデータを入力できるように、動的 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')
4

1 に答える 1

4

パラメータは単一の値であるため、=ではなくを使用しますIN。大きなテーブルではうまく機能しない非常に単純なアプローチは次のとおりです。

WHERE (@Product IS NULL OR oi.ProductID = @Product)
  AND (@Status IS NULL OR oi.LastMilestoneID = @Status)
  ... etc

あなたが実行しようとしているのは、Erland Sommarskog が「動的検索条件」と呼んでいるものです。この記事を読んで、すべてのオプションとそれぞれのメリット/デメリットを確認してください。

于 2012-12-12T19:14:58.320 に答える