我使用建议的方法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
的所有字符串(用逗号)?
答案 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
应该替换为分隔符的长度。