2016-12-06 5 views
0

Ich habe eine Funktion, die funktioniert, wie ich es möchte, aber ich muss eine Sache hinzufügen, und ich bin nicht in der Lage, es noch geschehen zu lassen.Automatische Auswahl der richtigen Datenbank innerhalb einer Funktion

Hier ist ein massiv vereinfachte Skelett der Funktion, die bereits funktioniert:

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 
)  

So, jetzt kann ich diese Funktion verwenden, um ein Datum spezifische Version der Abfrage nennen ich wollte. Groß! Jetzt ist das Problem, dass ich das im Laufe der Zeit nützlich machen möchte. datefield ist ein Archivdatum, und die diesjährigen Daten befinden sich in einer anderen Datenbank als die Daten von 2015, die sich in einer anderen Datenbank als 2014 befinden usw. Ich möchte, dass die Funktion das Jahr von @ a ansieht und dann die Datenbank bestimmt Abfrage gegen. Ich habe eine Vielzahl von Dingen ausprobiert, die nicht funktionierten, aber es scheint, als ob Dynamic SQL die Antwort ist, auf die jeder im Interweb trifft.

Ich möchte irgendwie eine if ... else-Anweisung verwenden, aber ich konnte das nicht zusammensetzen. Irgendwelche Vorschläge für das weitere Vorgehen?

+0

Haben Sie versucht, Fall wenn Ende? –

+0

Willst du sagen, dass du dynamisches SQL vermeiden willst? Wenn ja, geht es Ihnen gut, wenn Sie jedes Jahr die Funktion ändern müssen (oder jedes Mal, wenn eine neue Datenbank erstellt wird, von der Sie lesen müssen)? –

+1

Sie werden hier ziemlich dynamisch sql brauchen ... aber Sie haben ein Problem. Sie versuchen, dies in einer Funktion zu tun, und Sie können dynamische SQL in einer Funktion nicht verwenden. Schade, dass Sie die Tabellen nicht partitioniert haben, anstatt mehrere Kopien der Datenbank zu erstellen. –

Antwort

2

Verwenden Sie die vierteilige Benennung, um aus der richtigen Datenbank auszuwählen.

Beispiel

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 

Nur das Schema stellen Sie sicher, vorhanden ist, auch wenn es mit leeren Tabellen ist, wenn diese in einer Funktion platzieren Validierungsfehler zu vermeiden.

Verwandte Themen