SQL Server - 通过在查询中没有declare语句来创建视图

时间:2018-03-15 20:42:42

标签: sql-server-2008 tsql pivot database-view

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

我必须根据我的查询创建一个视图,但是由于我的查询中有declare语句,我从SQL Server收到错误。

我想要转变为视图的查询:

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 个答案:

答案 0 :(得分:0)

这不能变成视图。如果您查看CREATE VIEW的文档,您会看到它表明视图正文只是一个简单的SELECT语句而没有其他内容。它不接受任何类型的控制流程,变量或任何其他正文,只是一个有一些限制的单独选择。

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

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

另一个可行的替代方案是执行所有这些客户端并让数据库只运行查询。您将发出第一个选择以获取所需的列,然后使用您的客户端语言发出执行PIVOT的其他查询。