我需要按选定日期检索数据。有一个主要细节:用户可以一个接一个地选择两天,然后可以跳过几天,然后选择另一个。
将所选日期传递到存储过程并按此类日期范围组织过滤器的最佳方法是什么?
例如,我的表格具有以下结构:
CREATE TABLE [dbo].[Events](
[ID] [int] IDENTITY(1,1) NOT NULL,
[EventDate] [datetime] NOT NULL,
[Amount] [float] NOT NULL,
CONSTRAINT [PK_Events] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
使用以下数据:
INSERT [dbo].[Events] ([EventDate], [Amount]) VALUES ('2012-01-01 10:00', 12)
INSERT [dbo].[Events] ([EventDate], [Amount]) VALUES ('2012-01-01 11:00', 154)
INSERT [dbo].[Events] ([EventDate], [Amount]) VALUES ('2012-01-01 12:00', 4)
INSERT [dbo].[Events] ([EventDate], [Amount]) VALUES ('2012-02-01 10:00', 132)
INSERT [dbo].[Events] ([EventDate], [Amount]) VALUES ('2012-02-01 11:00', 212)
INSERT [dbo].[Events] ([EventDate], [Amount]) VALUES ('2012-03-01 10:00', 712)
INSERT [dbo].[Events] ([EventDate], [Amount]) VALUES ('2012-03-01 20:00', 892)
用户希望从2012-01-01 10:00和2012-01-01 11:00检索事件日期的数据, 从2012-03-01 09:00到2012-03-01 19:00等。
用户可以选择不同的间隔数。
答案 0 :(得分:2)
如果要向存储过程发送多个“相同”参数,通常表明您应该使用Table Valued Parameters(TVP)。
在存储过程中,您可以将TVP视为表变量,因此您的查询将如下所示:
SELECT
*
FROM
Events e
inner join
@MyTVP t
on
e.EventDate between t.FromDate and t.ToDate
假设您的TVP有两列,FromDate
和ToDate
具有明显的定义。