【发布时间】:2013-06-11 12:15:40
【问题描述】:
我有一张这样的桌子
TABLEX-
+------+------------+
| NAME | TABLE_NAME |
+------+------------+
| X1 | X001 |
| X2 | X002 |
+------+------------+
这个表包含一个 name 列,它只是描述和一个 table_name 列,它实际上是一个已经存在于数据库中的表。
X001 表中有 X1_A, X1_B 之类的列 X002 表中有 X2_A, X2_B 之类的列
现在我想以逗号分隔的字符串连接TABLE_NAME 列中实际表中的所有列,并将其显示为一列。
+------+------------+------------+
| NAME | TABLE_NAME | COLUMNS |
+------+------------+------------+
| X1 | X001 | X1_A, X1_B |
| X2 | X002 | X2_A, X2_B |
+------+------------+------------+
现在可以使用 CTE 来实现。我已经使用STUFF 和XML PATH 成功创建了查询,但是我遇到了性能问题,因为我在上面显示的表中有大约 200 行奇数行,并且每个链接的后续表每个都有 100 列.
编辑 -
SELECT
P.NAME,
P.TABLE_NAME,
[COLUMNS]=(SELECT STUFF((SELECT ',' + NAME FROM sys.syscolumns WHERE ID = OBJECT_ID(P.TABLE_NAME) ORDER BY colorder FOR XML PATH('') ), 1, 1,''))
FROM TABLEX P
TABLEX 是上面发布的表格。
【问题讨论】:
-
你能发布你现有的代码吗?为什么需要连接 100 列数据?
-
@bluefeet 我认为他们只想要一个以逗号分隔的列名列表。
-
@wagregg 包含表名列表的表有 200 行。我会避开
INFORMATION_SCHEMA.COLUMNS并使用sys.columns以获得更好的性能。 -
@MartinSmith 可能是真的,这就是为什么我要求查看他们的实际代码,以便清楚他们连接的内容。
-
每个表中有 200 个表和 100 个列,
for xml查询在我的计算机上需要 100 毫秒,而在 SQL Fiddle 中需要将近 1 秒。这可能是什么原因让你执行得这么慢?sys.syscolumns中有多少行?
标签: sql-server tsql sql-server-2008-r2 common-table-expression