【发布时间】:2016-07-22 17:56:27
【问题描述】:
我编写了一个动态查询,如下所示:
DECLARE @sql nvarchar(max)
SELECT @sql =
'select distinct datetable.Date
from (
select cast(DATEADD(day,-(a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a)),getdate()) as date) AS Date
from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4
union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4
union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4
union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4
union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as d
union all
select cast(DATEADD(day,(a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a)),getdate()) as date) AS Date
from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4
union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4
union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4
union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4
union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as d
) datetable
where '
+
replace(replace(replace(stuff((SELECT ' or datetable.Date between cast(''' + cast(cast(hld1.StrDate as date) as nvarchar(12)) + N''' as date) and cast(''' + cast(cast(hld1.endDate as date) as nvarchar(12))+ N''' as date)
'
from hld1 for xml path('')),1,3,''), '<', '<'), '>', '>'), '
', char(13)) +
'order by datetable.Date '
--print @sql
EXEC sys.sp_executeSQL @SQL
HLD1 是假期列表,其中每个假期都有开始和结束日期。查询本身返回定义为假期的日期列表。 (我不能只选择开始日期并将它们合并到结束日期的原因是很可能会有一个三天的假期,而中间的一天不会出现在任何一个列表中。
但是,我正在使用这个怪物来创建一个函数,并且作为函数的一部分,我希望能够执行类似“如果日期在此列表中,则执行以下操作”之类的操作。
我最初的计划是设置一个仅显示日期列表的视图;但是,这是不可能的,因为它使用变量,并且视图中不允许使用变量。
我的下一个想法是创建一个只返回列表的函数。但是,当我输入将其创建为函数的语法时,出现错误The last statement included within a function must be a return statement.
我不确定我应该从这里走哪条路。我不能只是制作一个表格并手动列出日期的原因是目前该列表仅延伸到 2016 年。此外,假期列表(开始和结束日期)可能会为不同的数据库创建/添加不同的数据库最终目标函数将被添加并使用。
如果您需要更多背景/信息,请告诉我,我很乐意提供。我只是边走边学。 :)
编辑 1:我找到了以下链接,但它似乎不适用于这种情况:Create A View With Dynamic Sql
【问题讨论】:
-
也许您应该发布 hld1 表。表定义和几行样本数据就足够了。除此之外,您要尝试做的解释也会有所帮助。到目前为止,我只是不明白你需要完成什么。
标签: sql-server tsql dynamic-sql