2016-12-06 46 views
0

我有一個按我希望的方式工作的函數,但是我需要添加一件事情,但是我無法完成它。在函數中自動選擇正確的數據庫

這裏的功能的大規模簡化骨架已經工作:

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語句,但一直未能將它們放在一起。有關如何進行的任何建議?

+0

結束了嗎? –

+0

你是說你想避免使用動態SQL?如果是這樣,你是否每年都需要修改該函數(或每次創建新數據庫時都需要閱讀)? –

+1

你幾乎需要在這裏使用動態sql ...但你有一個問題。你正在試圖在一個函數中做到這一點,你不能在一個函數中使用動態sql。太糟糕了,您沒有對錶進行分區而不是製作數據庫的多個副本。 –

回答

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 

只要確保該模式存在,即使是空表,把這個當函數內部,以避免驗證錯誤。

相關問題