2016-12-06 5 views
0

私はそれが好きなように機能していますが、1つのことを追加する必要があり、まだ実現できません。関数内の正しいデータベースを自動的に選択

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は誰もがinterwebsに到着する答えのように思えます。

何らかの理由でif ... elseステートメントを使用したいが、それをまとめることができなかった。どのように進めるための提案?

+0

終了時に大文字と小文字を区別しましたか? –

+0

動的SQLの使用を避けたいと言っていますか?そうであれば、毎年(または新しいデータベースが作成されるたびに読み込みが必要になるたびに)関数を変更する必要はありますか? –

+1

ここでは、動的SQLを使用する必要がありますが、問題があります。関数内でこれを実行しようとしており、関数内で動的SQLを使用することはできません。データベースの複数のコピーを作成するのではなく、テーブルを分割していないのは残念です。 –

答えて

2

4つの部分からなる名前を付けて、適切なデータベースから選択します。

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 

ただ、スキーマが検証エラーを回避するために、関数内でこれを配置するときには、空のテーブルにある場合でも、存在することを確認してください。

関連する問題