2015-04-14 40 views
0

我有下面的代碼 -存儲過程接受可選值SQL

我想創建這需要在產品中的可選起始數據和可選的結束日期的過程。目前,這些日期不能被排除在外

IF OBJECT_ID(N'dbo.usp_Order') IS NOT NULL 
     DROP PROCEDURE dbo.usp_Order 
    GO 
    CREATE PROCEDURE dbo.usp_Order 
    AS 
    SELECT 
      o.OrderId 
      o.product 
      d.date 

    FROM Order o 

    INNER JOIN Dates d 

    ON o.orderid=d.dateid 

    WHERE "DATE" BETWEEN '09/16/2008' and '09/21/2016' 

    GO 

     execute usp_Order 

我已經試過指定@「日期」日期= null,而@「日期」在where子句中,但不工作IS NULL。

任何想法?謝謝

+0

如果日期的一個被遺漏應該發生什麼?你想在所有日期之後/之前獲得所有記錄嗎?如果兩者都被排除在外,你是否想要獲得所有記錄? –

回答

2

可選參數的語法一般建立在參數的語法上。你的存儲過程沒有參數:

CREATE PROCEDURE dbo.usp_Order (
    @start_date date = NULL, 
    @end_date date = NULL 
AS 
    SELECT o.OrderId o.product, d.date 
    FROM Order o INNER JOIN 
     Dates d 
     ON o.orderid = d.dateid 
    WHERE [DATE] BETWEEN @start_date and @end_date 
GO 

作爲一個說明:它看起來像此存儲過程會更有意義的表值函數,但是那是另一回事。此外,您可能希望使用默認值執行更智能的操作,而不是返回行;但是,您不指定默認設置。

1

試試這個..

CREATE PROCEDURE dbo.usp_Order 
(
    @Startdate date = null, 
    @Enddate date = null 
) 
AS 
begin 
    SELECT 
      o.OrderId 
      o.product 
      d.date 

    FROM Order o 

    INNER JOIN Dates d 

    ON o.orderid=d.dateid 

    WHERE ([DATE] >= @Startdate or @Startdate is null) 
     and ([DATE] <= @Enddate or @Enddate is null) 
end 
GO 
+2

您還需要爲日期參數指定NULL默認值,以便它們是可選的。 –

+0

由於「日期」,這將產生錯誤。 –

0

爲了避免比較日期爲NULL意想不到的結果,開始日期和結束日期爲最小和DateTime

CREATE PROCEDURE dbo.usp_Order (
    @FromDate Datetime = '1753-01-01' -- January 1, 1753 
    @ToDate Datetime = '9999-12-31' -- December 31, 9999 
) 
AS 
SELECT 
     o.OrderId 
     o.product 
     d.[date] 

FROM Order o 

INNER JOIN Dates d 

ON o.orderid=d.dateid 

WHERE d.[date] BETWEEN @FromDate and @ToDate 

GO 
+0

Nahhh。不要這樣做。相反,默認將參數設置爲null,然後比較爲WHERE d。[Date]> = ISNULL(@FromDate,d。[Date] AND d。[Date] <= ISNULL(@ToDate,d。[Date ])。 –

+0

@ThorstenDittmar:爲什麼?使用ISNULL函數而不是硬編碼的最小值和最大值有什麼好處?如果有的話,硬編碼值應該運行得更快 –

+0

列出所有宗教先知的數據庫在耶穌中會遇到一些麻煩你的情況......另外'null'是'not specified'的定義,所以如果你不想指定某些東西,'null'就是要走的路,其他的東西都是非常不直觀的,但也許這就是我。 .. –

0

最大值聲明日期1日期2像

@Date1 date = NULL, 
    @Date2 date = NULL 

選擇 o.OrderId o.product d.date

FROM Order o 

INNER JOIN Dates d 

ON o.orderid=d.dateid 

WHERE "DATE" BETWEEN @Date1 and @Date2 
+0

*和*確保修改查詢...怎麼樣? –

0

你需要考慮,其中一個或兩個日期null的情況。當你還沒有指定您是否想獲得的所有記錄或沒有記錄的話,我會以「讓所有的記錄」走:

CREATE PROCEDURE dbo.usp_Order (
    @start_date date = NULL, 
    @end_date date = NULL 
AS 
    SELECT o.OrderId o.product, d.date 
    FROM Order o INNER JOIN 
     Dates d 
     ON o.orderid = d.dateid 
    WHERE 
     d.date BETWEEN ISNULL(@start_Date, d.date) AND ISNULL(@end_Date, d.date)