在函数

时间:2016-12-06 21:58:59

标签: sql-server

我有一个按照我的意愿工作的功能,但是我需要添加一个功能,但我还没有能够实现它。

这是一个已经有效的功能的大规模简化骨架:

create function IC
(
@A date
)
returns table 
as
return 
(
SELECT       *

FROM        db1.dbo.table a LEFT JOIN
            db1.dbo.table2 b
            on a.randomfield=b.randomfield
            where datefield = @a
)      

所以现在我可以使用此函数调用我想要的查询的日期特定版本。大!现在的问题是我希望随着时间的推移使这个变得有用。 datefield是一个存档日期,今年的数据与2015年的数据位于不同的数据库中,数据与2014年的数据库不同,等等。我希望函数查看@ a的年份,然后用它来确定哪个数据库为查询。我已经尝试了各种不起作用的东西,但似乎动态SQL是每个人都在互联网上得到的答案。

我想以某种方式使用if ... else语句,但未能将它们放在一起。有关如何进行的任何建议吗?

1 个答案:

答案 0 :(得分:2)

使用四部分命名从正确的数据库中进行选择。

实施例

DECLARE @year INT = DATEPART(yyyy, GETDATE())

SELECT CASE @year
   WHEN 2016 THEN   
       (SELECT 1 FROM ARCHIVE2016.dbo.SomeTable)
   WHEN 2017 THEN   
       (SELECT 1 FROM ARCHIVE2017.dbo.SomeTable)
   WHEN 2018 THEN   
       (SELECT 1 FROM ARCHIVE2018.dbo.SomeTable)
END

在将函数置于函数内以避免验证错误时,只需确保架构存在,即使它是空表也是如此。