无法将多行连接成单个文本字符串 sql 服务器 2008
Unable to Concatenate many rows into a single text string sql server 2008
如果没有 XML 函数,还有其他方法可以做到这一点吗?我试过关注 Concatenate many rows into a single text string?
我在 SQL Server 2008 R2 上尝试 运行 时遇到问题。
将 varchar 值“,”转换为数据类型 int 时转换失败。
Select distinct ST2.id
substring(
(
Select ','+ST1.id AS [text()]
From dbo.idstable ST1
Where ST1.id = ST2.id
ORDER BY ST1.id
For XML PATH ('')
), 2, 1000) [idstable]
From dbo.idstable ST2
语法错误的原因是 DISTINCT
之后的无关列名。下面是一个类似的方法,它使用 STUFF
和 TYPE
来避免字符串中的特殊字符出现问题。
SELECT DISTINCT
STUFF(
(
SELECT ','+CAST(ST1.id AS varchar(10)) AS [text()]
FROM dbo.idstable ST1
WHERE ST1.id = ST2.id
ORDER BY ST1.id
FOR XML PATH (''), TYPE
).value('.', 'nvarchar(MAX)'), 1, 1, '') [Students]
FROM dbo.idstable ST2;
旧 SQL 版本支持的聚合字符串连接的另一种方法是游标。
就目前而言,Dan 的回答是正确的。从性能的角度来看,最好在子查询中执行 distinct
(并且可能在外部查询中包含 id
:
SELECT id
STUFF( (SELECT ',' + CAST(ST1.id AS varchar(10)) AS [text()]
FROM dbo.idstable ST1
WHERE ST1.id = ST2.id
ORDER BY ST1.id
FOR XML PATH (''), TYPE
).value('.', 'nvarchar(MAX)'
), 1, 1, '') as [Students]
FROM (SELECT DISTINCT id dbo.idstable) ST2;
如果没有 XML 函数,还有其他方法可以做到这一点吗?我试过关注 Concatenate many rows into a single text string? 我在 SQL Server 2008 R2 上尝试 运行 时遇到问题。
将 varchar 值“,”转换为数据类型 int 时转换失败。
Select distinct ST2.id
substring(
(
Select ','+ST1.id AS [text()]
From dbo.idstable ST1
Where ST1.id = ST2.id
ORDER BY ST1.id
For XML PATH ('')
), 2, 1000) [idstable]
From dbo.idstable ST2
语法错误的原因是 DISTINCT
之后的无关列名。下面是一个类似的方法,它使用 STUFF
和 TYPE
来避免字符串中的特殊字符出现问题。
SELECT DISTINCT
STUFF(
(
SELECT ','+CAST(ST1.id AS varchar(10)) AS [text()]
FROM dbo.idstable ST1
WHERE ST1.id = ST2.id
ORDER BY ST1.id
FOR XML PATH (''), TYPE
).value('.', 'nvarchar(MAX)'), 1, 1, '') [Students]
FROM dbo.idstable ST2;
旧 SQL 版本支持的聚合字符串连接的另一种方法是游标。
就目前而言,Dan 的回答是正确的。从性能的角度来看,最好在子查询中执行 distinct
(并且可能在外部查询中包含 id
:
SELECT id
STUFF( (SELECT ',' + CAST(ST1.id AS varchar(10)) AS [text()]
FROM dbo.idstable ST1
WHERE ST1.id = ST2.id
ORDER BY ST1.id
FOR XML PATH (''), TYPE
).value('.', 'nvarchar(MAX)'
), 1, 1, '') as [Students]
FROM (SELECT DISTINCT id dbo.idstable) ST2;