用于将字符串/行连接成一个字符串/行的SQL? (如何在INSERT中使用FOR XML PATH?)

时间:2014-11-04 09:22:08

标签: sql sql-server xml string-concatenation

我使用建议的方法here将表中的几个行/字符串(在Microsoft SQL Server 2010上)连接成一个字符串:

SELECT ',' + col FROM t1 FOR XML PATH('')

但是,如果我尝试将结果字符串作为(单个)行插入到另一个表中,如下所示:

INSERT INTO t2
SELECT ', ' + col FROM t1 FOR XML PATH('')

我收到此错误消息:

The FOR XML clause is not allowed in a INSERT statement.

t2目前有一个NVARCHAR(80)类型的列。我如何克服这个问题,即如何将包含许多行的表t1折叠到表t2中,其中的行连接t1的所有字符串(用逗号)?

2 个答案:

答案 0 :(得分:3)

而不是xml路径为什么不这样做呢?

DECLARE @Cols VARCHAR(8000) 
SELECT @Cols = COALESCE(@Cols + ', ', '') + 
    ISNULL(col, 'N/A')
FROM t1
Insert into t2 values(@Cols);

答案 1 :(得分:2)

在插入之前,您需要将其强制转换为nvarchar()。我使用这种方法,也删除了第一个分隔符,并且我正在执行, type部分,它正确处理实体。

insert into t2
select stuff((
    select ', ' + col from t1
    for xml path(''), type
).value('.', 'nvarchar(80)'), 1, 2, '')

因此,您将所有col与前缀逗号+空格连接为xml对象。然后你带着.value()的孩子用xquery-path .,这意味着"带走我们所在的孩子,不要在任何地方穿越#34;。您将其转换为nvarchar(80),并使用空字符串1替换从位置2和长度''开始的子字符串。因此,2应该替换为分隔符的长度。