【问题标题】:What's the syntax to pivot this?旋转这个的语法是什么?
【发布时间】:2018-05-08 16:00:47
【问题描述】:

我想从临时表中获取一组列作为一行。以下:

 select name from tempdb.sys.columns where object_id = object_id('tempdb..##myTempTable')

产生类似的东西

|name|
------
Col1
Col2
Col3
Col4
...

我可以转动它来获得 col1 | Col2 | Col3 | Col4 | ... ?在列中,不作为单个值。

我不会提前知道列的名称。

【问题讨论】:

标签: sql sql-server tsql sql-server-2008-r2


【解决方案1】:

没有单一的语法可以以这种方式旋转这些数据。

SQL 语言(适用于任何数据库)严格要求在查询编译时知道结果中每列的数量和类型。这是为了让数据库引擎确定正确的权限并计算执行计划所必需的。即使SELECT * 查询也满足此要求,因为查询使用的表中列的数量和类型是固定的且已知的(至少在单个查询的生命周期内)。

这个问题要求做什么打破了这个要求。列标题由数据决定,因此数据库引擎在查询开始执行之后之前无法知道结果需要多少列。

解决这个问题的唯一方法是将查询分成三个独立的步骤:

  1. 运行更简单的查询以确定最终结果的列标题。
  2. 使用 #1 的结果动态构建新的 SQL 字符串
  3. 从 #2 执行查询并将其结果返回给用户。

【讨论】:

  • 你是对的。甚至@Horaciux 的答案也给出了一行列名。
【解决方案2】:
 declare @cols varchar(max)=''
 declare @query varchar(max)
 select @cols=''''+name+''','+@cols from tempdb.sys.columns 
 where object_id = object_id('tempdb..##myTempTable')

 select @cols=left(@cols,len(@cols)-1)

set @query= 'select ' + @cols 

execute(@query)

如果需要名称列,请更改此行

 select @cols=''''+name+''''+ name  +','+@cols from  sys.columns 
  where object_id = object_id('hrc.dbo.car')

【讨论】:

  • 为什么投反对票?另外,我没有得到你的评论@PatrickSchomburg
猜你喜欢
  • 2021-04-21
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多