Переменная в запросе - PullRequest
1 голос
/ 31 мая 2011

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

declare @name varchar(max)
set @name = 'ColumnID'
select @name from Account

, которое возвращает большое количество ColumnID, но у меня будет столбец результата ColumnID в таблице счетов

Ответы [ 3 ]

3 голосов
/ 31 мая 2011

Вы захотите выполнить динамический оператор SQL:

exec('select ' + @name + ' from Account');

Остерегайтесь чрезмерного их использования, поскольку они могут прийти с довольно здоровенным багажом:

Преимущества

  • Это дает гибкость и масштабируемость
  • Это может уменьшить количество строк код написан

Недостатки

  • Это может стать очень сложным и трудным для чтения. Подумайте о кавычках, включенных в кавычки, и о других подобных вещах.
  • Это может отрицательно сказаться на стабильности кода. Некоторые ошибки динамического SQL не будут известны до времени выполнения. (Примером этого является то, что вы ссылаетесь на несуществующую таблицу)
  • Код динамического SQL сложнее проверить, чем эквивалентный статический SQL. Также может оказаться невозможным протестировать все возможные обстоятельства, с которыми столкнется ваш динамический SQL, что создает риск, связанный с этим.
  • Провести эффективный анализ влияния на динамический SQL в вашей кодовой базе будет сложнее.
  • Внедрение и неправильное использование SQL - Динамический SQL более подвержен неправильному использованию и неизменно менее безопасен, чем статический SQL
  • Код запросов в Dynamic SQL не подчиняется плану запросов, и поэтому такие оптимизации могут быть пропущены. Таким образом, он может быть медленнее, чем эквивалентный статический SQL Поскольку запрос SQL неизвестен до времени выполнения, он может быть сложнее для настройки производительности SQL
  • Динамический код (например, определение индексов, которые могут потребоваться для таблицы)
1 голос
/ 31 мая 2011

Попробуйте это:

declare @name varchar(max);
set @name = 'ColumnID';

exec('select ' + @name + ' from Account');
0 голосов
/ 31 мая 2011

попробуйте использовать хранимую процедуру sp_executesql

declare @name nvarchar(20);
set @name = 'ColumnID';
declare @sql nvarchar(max)
set @sql='select ' + @name + ' from Account'
exec sp_executesql  @sql
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...