Sql 不将查询存储为字符串的动态透视查询

Sql 不将查询存储为字符串的动态透视查询,sql,sql-server,sql-server-2005,sql-server-2008,pivot,Sql,Sql Server,Sql Server 2005,Sql Server 2008,Pivot,我完全熟悉用于执行动态透视查询的链接中的以下方法。是否有其他方法可以执行动态透视,而无需将查询存储为字符串并在其中插入列字符串 简短回答:否。 长答案: 好吧,那还是不。但我会尽力解释原因。现在,当您运行查询时,DB引擎需要知道查询将返回的结果集结构(列数、列名、数据类型等)。因此,当您从DB请求数据时,必须定义结果集的结构。想一想:您是否曾经运行过一个查询,而您事先不知道结果集的结构 即使您选择了,这也同样适用,这只是一种糖类语法。最后,返回的结构是“该表中的所有列” 通过组合字符串,您可以在

我完全熟悉用于执行动态透视查询的链接中的以下方法。是否有其他方法可以执行动态透视,而无需将查询存储为字符串并在其中插入列字符串


简短回答:否。

长答案:

好吧,那还是。但我会尽力解释原因。现在,当您运行查询时,DB引擎需要知道查询将返回的结果集结构(列数、列名、数据类型等)。因此,当您从DB请求数据时,必须定义结果集的结构。想一想:您是否曾经运行过一个查询,而您事先不知道结果集的结构

即使您选择了,这也同样适用,这只是一种糖类语法。最后,返回的结构是“该表中的所有列”

通过组合字符串,您可以在请求结果集之前动态生成所需的结构。这就是它起作用的原因

最后,您应该知道,动态组装字符串在理论上和潜在上(尽管不太可能)都可以得到一个包含无限列的结果集。当然,这是不可能的,它将失败,但我相信你理解其中的含义

更新

我发现了这一点,这强化了它不起作用的原因

:

SSIS依赖于提前知道数据流的元数据和 dynamic pivot(您所追求的)与不兼容 那个


我会在这里继续查找和添加。

我同意简短的答案,但我不确定长的答案。@Conrad你怎么说?老实说,我不知道SQL Server团队为什么使用不允许动态列的语法,所以我不能说。我确实知道,如果
sometable
的结构发生变化,则进程中的
Select*from sometable
的输出或作为查询的输出确实会发生变化,所以这不可能,因为“DB引擎必须知道结果集结构”。
Select*
只是一种简单的语法。最后,返回的结构是“该表中的所有列”。你知道它们是什么。另一件事是由任何数据定义动态列。然而,我稍微改变了我的答案,因为我找不到支持我答案的来源。