【问题标题】:Dynamic Query Restructuring for View视图的动态查询重组
【发布时间】:2014-06-27 03:25:52
【问题描述】:

我创建了一个动态 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)

【问题讨论】:

  • 您不能在必须使用存储过程的视图中使用动态 SQL。
  • 您可以使用动态脚本创建/重新创建视图,这是您在这方面最值得信赖的。

标签: sql sql-view dynamicquery


【解决方案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

【讨论】:

  • PIVOT 要求在执行时知道 IN 子句中的值。 SELECT 语句不能以您编写的方式使用。
  • 很抱歉这么说,但您似乎对 PIVOT 语法也很生疏。
  • 嗯,这将是我在 年的整个职业生涯中第三次使用 PIVOT。此外,这就是问题的方式。这一个很好的借口,不是吗?
  • 我建议您在回答之前确保您了解语法。问题中使用的 XML 语法是创建动态 SQL 字符串所需的列列表,您不能在 PIVOT IN 中使用它。在发布答案之前,我还会确保您的语法有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
相关资源
最近更新 更多