Динамический запрос в SQL Server - PullRequest
1 голос
/ 09 февраля 2009

У меня есть таблица с 10 столбцами в виде col_1, col_2, .... col_10. Я хочу написать оператор выбора, который выберет значение одной строки и одного из этих 10 столбцов. У меня есть переменная, которая будет решать, какой столбец выбрать. Можно ли написать такой запрос, когда имя столбца определяется динамически из переменной.

Ответы [ 9 ]

11 голосов
/ 09 февраля 2009

Да, используя оператор CASE:

SELECT CASE @MyVariable
       WHEN 1 THEN [Col_1]
       WHEN 2 THEN [Col_2]
       ...
       WHEN 10 THEN [Col_10]
       END

Является ли это хорошей идеей, это совсем другой вопрос. Вы должны использовать лучшие имена, чем Col_1, Col_2 и т. Д.

Вы также можете использовать метод подстановки строк, как это предлагают другие. Однако это последний вариант, поскольку он может открыть ваш код для атак с использованием SQL-инъекций.

3 голосов
/ 10 февраля 2009

Хорошая статья для тех, кто хочет заняться динамическим sql:

Проклятие и благословения динамического SQL

3 голосов
/ 09 февраля 2009

Для меня это звучит как плохой денормализованный дизайн.

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

Если дочерняя таблица довольно статична, это будет работать.

2 голосов
/ 09 февраля 2009

Поскольку у меня недостаточно подробностей, я не могу дать код. Вместо этого я объясню.

Объявление строковой переменной, что-то вроде:

declare @sql varchar(5000)

Установите эту переменную в качестве завершенной строки SQL, которую вы хотите (в виде строки, а не на самом деле запроса ... поэтому вы встраиваете нужное имя строки с использованием конкатенации строк).

Затем позвоните: exec(@sql)

Все готово.

1 голос
/ 09 февраля 2009

Я предполагаю, что вы работаете исключительно в Transact-SQL. Вам нужно динамически создать инструкцию SQL с вашей переменной в качестве имени столбца и использовать команду EXECUTE для ее запуска. Например:

EXECUTE('select ' + @myColumn + ' from MyTable')
0 голосов
/ 12 февраля 2009

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

0 голосов
/ 09 февраля 2009

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

var query = context.Table
                   .Where( t => t.Id == row_id )
                   .Select( "Col_" + column_id );

IEnumerator enumerator = query.GetEnumerator();
enumerator.MoveNext();
object columnValue = enumerator.Current;

Предположительно, вы будете знать, к какому фактическому типу это привести, в зависимости от столбца. Приятно то, что вы получаете параметризованный запрос бесплатно, защищая вас от атак SQL-инъекций.

0 голосов
/ 09 февраля 2009

ИМХО, Пример изложения Джоэла Кехорна , вероятно, лучшая идея

... но если вам действительно нужно использовать динамический SQL, вы можете сделать это с помощью sp_executeSQL ()

0 голосов
/ 09 февраля 2009

Вы можете сделать это с помощью оператора T-SQl CASE:

SELECT 'The result' =
   CASE 
     WHEN choice = 1 THEN col1
     WHEN choice = 2 THEN col2
     ...
   END
FROM sometable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...