У меня есть скалярная функция, которая возвращает VARCHAR
имени столбца.Элегантный способ выбора столбца на основе результата переменной/запроса?
Я хотел бы использовать этот результат в основе запроса на выборку на, так:
SELECT dbo.udf_GetColName('Val1', ColumnFromThisTable, etc) AS myCol
FROM tbl_ThisTable WHERE ...
На данный момент, это правильно перечисляя фактический выход UDF, имя столбца, для каждого значения.
То, что я хотел бы для выбора заявления, чтобы вернуть значение столбца возвращаемого функцией , так:
SET @sql = 'SELECT ' + dbo.udf_GetColName('Val1', ColumnFromThisTable, etc) + ' AS myCol
FROM tbl_ThisTable WHERE ... '
И запустить EXEC sp_executesql
Есть ли лучший способ, чем динамический SQL-маршрут? Каким-то образом SQL может запросить этот столбец как вывод из UDF?
EDIT ДОБАВИТЬ
Это где бизнес нужно управлять правилами, по которым выход выбран, следовательно, они должны быть в обновляемой таблице. Если они жестко закодированы в SELECT
функций Table-Valued, это уже не тот бизнес, который их контролирует.
Так что да, запрос очень настраиваемый, но в этом случае «хорошая вещь».
Кроме того, существует конечное число параметров в udf_GetColName
. Он получает имя исходного столбца, значение исходного столбца, которое выполняет поиск в таблице правил. Если правило находит совпадение этого столбца с этим значением, выбирается и возвращается output column
, в противном случае используется значение по умолчанию output column
. Это столбец, который нужно выбрать, следовательно, потенциально может сильно отличаться от входного или входного значения.
Как сказано, я рад услышать любые другие идеи и, конечно, если это глупо, и нужно выбрать другой маршрут!
FINAL РЕДАКТИРОВАТЬ НА ДЕНЬ ДО Я иду домой
Я ищу способ, чтобы выбрать, какие колонки использовать из tbl_ThisTable
, основываясь на других значений столбцов в tbl_ThisTable
.
Эти правила относительно того, какой столбец использовать, должны быть легко обновлены в таблице - основное ограничение - интерфейс/передний конец базы данных - мы можем только возвращать прямые наборы данных, поэтому не можем использовать переднюю часть, чтобы сделать это решение/конкатенировать несколько наборов данных и т. д.
Если есть хороший способ развернуть эти правила, которые могут быть обновлены в базе данных без перезаписи кода, я бы хотел их услышать. Я просто тестирую это на данный момент, поэтому дизайн является гибким.
То, что вы пытаетесь достичь, сложно, потому что это плохая практика иметь метаданные о базе данных в базе данных. Хотя иногда и простительно, причина, по которой вам нужно это сделать, вероятно, является ошибкой в дизайне базы данных, а не практическим требованием. –
Что @Neils сказал. Это приближается к http://en.wikipedia.org/wiki/Inner-platform_effect. – gbn
@Niels. Попробуйте установить некоторые правила в отношении того, какие данные должны выводиться на основе критериев - однако управление этими правилами необходимо разместить с бизнесом, следовательно, в обновляемой таблице, а не жестко закодированной в функции views/Table-Valued. Это не идеально, но, к сожалению, необходимо. – RemarkLima