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,

Другие вопросы по тегам