SQL Server - создание представления, не имеющего объявления оператора в запросе
Я создал запрос для преобразования данных вертикальной таблицы в горизонтальную, и у меня есть declare
Заявление в моем запросе.
Я должен создать представление на основе моего запроса, но я получаю сообщение об ошибке от SQL Server, так как у меня есть declare
Заявление в моем запросе.
Запрос, который я пытаюсь превратить в представление:
declare @columnName nvarchar(max)
declare @query nvarchar(max)
select
@columnName = COALESCE(@columnName + ', ', '') + QUOTENAME(element_name)
from
(select distinct
element_name
from
elements e
join
form_elements fe on fe.element_id = e.id
join
form on fe.form_id = form.id and form.id = 1) as B
set @query = 'select *
from
(select fi.index_key as incidnet_id, e.element_name as col_name, fev.value as value
from form_element_values fev
join form_index fi on fev.form_index_id = fi.id
join form_elements fe on fev.form_element_id = fe.id
join elements e on fe.element_id = e.id
join form f on fi.form_id = f.id
where f.id = 1) as SourceData
PIVOT(max(value) for col_name in (' + @columnName + ')) as pivotTable'
exec(@query)
Этот запрос берет данные из вертикальной таблицы и показывает их в горизонтальных столбцах
Поскольку имя моего столбца является динамическим, мне нужно создать локальную переменную, но сейчас у меня возникают трудности с преобразованием этого запроса в представление.
Есть ли другая альтернатива для этого запроса, поэтому мне не нужно использовать локальную переменную?
1 ответ
Это не может быть превращено в представление. Если вы проверите документацию для CREATE VIEW
вы увидите, что это означает, что тело представления просто SELECT
заявление и ничего больше. Он не принимает какой-либо поток управления, переменные или любое другое тело, только один выбор с несколькими ограничениями.
Представление в базе данных - это просто SELECT
хранится в базе данных, из которой можно делать и расширять запросы, но не более того. В этом случае ваш запрос требует динамического SQL, и это выходит за рамки возможностей представления. Как вы отметили в комментариях, ни одна из этих функций невозможна, поскольку они не могут иметь ничего, что может иметь побочные эффекты, а запуск пакета динамического SQL может делать практически все, поэтому они там запрещены.
Единственный вариант сохранить это на стороне БД - использовать хранимую процедуру. В комментариях также отмечается, что вы ничего не можете сделать с результирующим набором, кроме как использовать его (по крайней мере, не так просто, посмотрите здесь некоторые детали, а также этот вопрос).
Другая жизнеспособная альтернатива - сделать все это на стороне клиента и покинуть базу данных, чтобы просто выполнить запрос. Вы должны выполнить первый выбор, чтобы получить необходимые столбцы, а затем использовать свой клиентский язык, чтобы выполнить другой запрос, выполнив PIVOT
,