2016-12-06 4 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, а затем используйте это, чтобы определить, какая база данных запрос против. Я пробовал разные вещи, которые не сработали, но похоже, что Dynamic 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 

Просто убедитесь, что схема существует, даже если она с пустыми таблицами, при размещении этого внутри функции, чтобы избежать ошибок проверки.

Смежные вопросы