2012-05-30 2 views
4

Я пытаюсь создать набор данных, которые я собираюсь записать в файл, это по существу отчет, состоящий из различных полей из нескольких разных таблиц, для некоторых столбцов чтобы на них была обработана некоторая обработка, некоторые могут быть выбраны.SQL - Вычисление столбцов с использованием динамических функций

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

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

Для простого, немного нечетным, например, штатный стол:

Employee | DOB   | VacationDays 
Frank | 01/01/1970 | 25 
Mike  | 03/03/1975 | 24 
Dave  | 05/02/1980 | 30 

Я думаю, что я либо в конечном итоге с запросом, как

SELECT NameFunction(Employee, optionID), 
     DOBFunction(DOB, optionID), 
     VacationFunction(VacationDays, optionID), 
from Employee 

С определенных пользователем функций, где optionID будет использоваться в описании case внутри функций, чтобы решить, какую обработку выполнить.

Или я бы хотел сделать так, как данные возвращаемые настраивается с помощью таблицы поиска других функций:

ID | Name     | Description 
1 | ShortName    | Obtains 3 letter abbreviation of employee name 
2 | LongDOB    | Returns DOB in format ~ 1st January 1970 
3 | TimeStampDOB   | Returns Timestamp for DOB 
4 | VacationSeconds  | Returns Seconds of vaction time 
5 | VacationBusinessHours | Returns number of business hours of vacation 

который кажется аккуратнее, но я не знаю, как я бы сформулировать запрос , предположительно используя динамический SQL? Есть ли разумная альтернатива?

Функции будут использоваться на нескольких тысячах строк.

Ближайший ответ, который я нашел, было в этой теме: Call dynamic function name in SQL

Я не большой поклонник динамического SQL, хотя в данном случае я думаю, что это может быть лучшим способом, чтобы получить результат я После?

Все ответы оценили, Спасибо, Крис

ответ

1

Я бы для второго решения. Вы даже можете использовать реальные хранимые имена процессов в своей таблице поиска.

create proc ShortName (
    @param varchar(50) 
)as 
begin 
    select 'ShortName: ' + @param 
end 
go 

declare @proc sysname = 'ShortName' 

exec @proc 'David' 

Как вы можете увидеть в приведенном выше примере, первый параметр Exec (т.е. имя процедуры) может быть параметром. Это сказало со всеми обычными предупреждениями относительно динамического sql ...

+0

Спасибо за пример, я собираюсь создать несколько тестовых таблиц/функций, чтобы поэкспериментировать с моими результатами и изучить их. Спасибо! (если бы у меня был представитель). – Chris

1

В конце концов, вы должны пойти в зависимости от того, что наступит быстрее, поэтому вы должны попробовать оба способа (и любой другой способ, которым кто-то может придумать), и решить после этого ,

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

Я предпочитаю использовать Dynamic SQL ony для улучшения производительности запроса, например, добавления динамического порядка или добавления/удаления сложных условий WHERE.

Но это все субъективные мнения, лучше всего попробовать, сравнить и решить.

+0

К счастью, я, вероятно, создам функции в любом случае и добавлю таблицу поиска в виде слоя над ними, поэтому не нужно слишком много хлопот, чтобы быстро проверить первый вариант. Спасибо (еще не хватило репутации, чтобы продвинуться). – Chris

1

На самом деле, это не вопрос того, что быстрее. Речь идет о том, что делает код более чистым, особенно для добавления новых функций (новые столбцы, новые форматы столбцов, их переупорядочение).

Не думайте о своем втором подходе как «использовании динамического SQL», поскольку это имеет тенденцию иметь отрицательные коннотации. Вместо этого подумайте об этом как о подходе, основанном на данных. Вы хотите создать таблицу, которая описывает столбцы, которые могут получить пользователи, и форматы. Отлично! Затем пользователи могут предоставить список столбцов, и у вас будет волшебная хранимая процедура, которая объединяет информацию от пользователей с информацией в вашей таблице метаданных и дает желаемый результат.

Я большой поклонник подходов, основанных на данных, а динамический SQL - лучший инструмент SQL, который я нашел до сих пор для их реализации.

+0

Спасибо за ответ, вы пытаетесь добиться того, чего я пытаюсь достичь, гибкости и удобочитаемости (поэтому следующий человек не должен делать то же самое распутывание, когда они хотят изменить вещи). Я посмотрю, как я дальше! (опять же, будет повышать, но все равно получать репутацию). – Chris

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