2015-05-22 2 views
0

Рассмотрим У меня есть таблица TEMP с двумя полями
БЛОК ZONE
==== ====
Unit1 Zone1
Unit2 Zone2
Как использовать строки имя столбца внутри динамического SQL

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

select UNIT, ZONE from TEMP 

Мой динамический запрос - это gi аже ниже

declare @qry nvarchar(1000) 
set @qry= 'declare @str varchar(100) = ''UNIT, ZONE'' 
select @str from TEMP ' 
execute sp_executesql @qry 

Но этот запрос выбирает значение строки («» БЛОКА, ZONE «») вместо приведенных ниже строк

Unit1 Zone1 
Unit2 Zone2 

Вкратце: Как я могу сказать, что SQL @str задает столбец в таблице?

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

declare @qry varchar(1000) 
declare @str varchar(100) = 'UNIT, ZONE' 
set @qry ='select ' + @str + ' from TEMP' 
execute sp_executesql @qry 
+2

Почему на земле вы не хотите, чтобы сделать это так, что вы уже знаете, работает ? Вся причина использования DynamicSQL * (Динамическая запись нового запроса для выполнения с помощью sp_executesql) * заключается в том, что ваши переменные могут быть только значениями строк и никогда не могут быть объектами (база данных, схема, таблица, столбец и т. Д.). Ссылка ... – MatBailie

+0

Объясните, почему вы не хотите использовать метод, который вы уже знаете. Невозможно дать вам альтернативу, если мы не знаем, почему найденный вами не применим. – Paolo

+0

@Paolo Спасибо за ваш ответ. Я знаю, что это выглядит странно, но имена полей также генерируются динамически, поэтому я не могу объявить его до вызова 'execute'. Подставляя значение, я могу сделать запрос как _выбрать foo из temp_, а не _select 'foo' из temp_? –

ответ

-1

Посмотрите на это так.

Если вы должны были выполнить запрос переменной @qry себя (т.е. без sp_executesql):

declare @str varchar(100) = 'UNIT, ZONE' 
select @str from TEMP 

Что вы получите? Ответ: UNIT, ZONE (повторяется для количества строк в таблице)

So sp_executesql выполняет свою работу правильно.

0

Вы можете попробовать Dynamic SQL в Dynamic SQL

declare @query nvarchar(max) = '' 
set @query = ' 
declare @columns nvarchar(50) = ''Unit, Zone'' 
declare @innerQuery nvarchar(255) = '' select '' + @columns + '' from Table '' 
exec(@innerQuery) 
' 
exec(@query) 

но это будет реальное самоубийство ...

+2

Это называется зарождением :-) –

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