SQL 服务器 - 通过在查询中不使用 declare 语句来创建视图

SQL Server - Creating view by not having declare statement in the query

我创建了将垂直 table 数据转换为水平数据的查询,并且我的查询中有一个 declare 语句。

我必须根据我的查询创建一个视图,但是我从 SQL 服务器收到一个错误,因为我的查询中有一个 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)

此查询从垂直 table 中获取数据并将其显示在水平列中

由于我的列名是动态的,我必须创建一个局部变量,但现在我很难将此查询转换为视图。

这个查询是否有其他替代方法,这样我就不必使用局部变量了?

这不能变成视图。如果您查看 CREATE VIEW 的文档,您会发现它表明视图的主体只是一个普通的 SELECT 语句,没有其他内容。它不接受任何类型的控制流、变量或任何其他主体,只是一个有一些限制的单独 select。

数据库中的视图就是存储在数据库中的SELECT,可以从中进行查询和扩展,但仅此而已。在这种情况下,您的查询需要动态 SQL,这超出了视图的能力。正如您在评论中指出的那样,函数也不可能,因为它们不能有任何可能产生副作用的东西,并且 运行 宁一批动态 SQL 几乎可以做任何事情,因此它们是被禁止的那里。

将此保留在数据库端的唯一选择是使用存储过程。评论中还指出,除了使用结果集之外,您不能对结果集执行任何操作(至少不是以任何简单的方式,look here for some details, and also at this question)。

另一个可行的替代方案是完成所有这些 client-side 并将数据库留给 运行 查询。您将发出第一个 select 以获得所需的列,然后使用您的客户端语言发出另一个查询执行 PIVOT.