2015-04-14 38 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)