#sql #sql-view #dynamicquery
#sql #sql-представление #dynamicquery
Вопрос:
Я создал динамический SQL-запрос, который я хочу использовать в качестве представления, однако запрос зависит от использования операторов ‘DECLARE’. Я безуспешно пытался реструктурировать его без операторов ‘DECLARE’, но не могу понять это правильно. Я использую SQL Server Express 2014 и был бы признателен за любую помощь.
DECLARE @query nvarchar(MAX)
DECLARE @Name nvarchar(MAX)
select @Name = STUFF((SELECT distinct ',' QUOTENAME(Name)
FROM [dbo].[ObjectView]
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SET @query = ' SELECT * from
(
select *
from [dbo].[ObjectView]
)t
pivot (MAX(Value) for Name IN (' @Name ')) AS PivotTable'
execute(@query)
Комментарии:
1. Вы не можете использовать динамический SQL в представлении, вы должны использовать хранимую процедуру.
2. Вы можете создать / воссоздать представление с помощью динамического скрипта, и это самое большее, на что вы можете рассчитывать в этом отношении.
Ответ №1:
Возможно, вам придется поиграть с синтаксисом XML. Я довольно ржавый.
create view viewname as
select * --< you really should call out the fields, here...
from(
select * --< ...and here.
from ObjectView
t
pivot( MAX( Value ) for Name in(
select distinct QUOTENAME( Name )
FROM ObjectView
FOR XML PATH )
) AS PivotTable
Комментарии:
1. PIVOT требует, чтобы значения внутри
IN
предложения были известны при его выполнении. Инструкции SELECT нельзя использовать так, как вы это написали.2. Извините, что говорю это, но вы, похоже, тоже устали от синтаксиса PIVOT.
3. Что ж, это будет примерно третий раз за всю мою карьеру <кашель> лет, когда я когда-либо использовал PIVOT. Кроме того, так оно и было в вопросе. Это хорошее оправдание, не так ли?
4. Я бы посоветовал убедиться, что вы понимаете синтаксис, прежде чем отвечать. Синтаксис XML, используемый в вопросе, предназначен для создания списка столбцов, необходимых для динамической строки SQL, вы не можете использовать его в СВОДКЕ
IN
. Я бы также убедился, что ваш синтаксис верен, прежде чем отправлять ответ.