SQL Server中使用INSERT INTO SELECT存储XML报错求助
解决FOR XML子句不能直接用于INSERT INTO SELECT的问题
这个问题我之前也碰到过,SQL Server确实不允许直接在INSERT INTO的SELECT语句里直接带FOR XML子句,不过有几种简单的解决办法:
方法一:用子查询包装FOR XML结果
把FOR XML的查询放在一个子查询里,让它返回单个XML标量值,这样就能直接插入到目标列中:
INSERT INTO table1 (column1) SELECT ( SELECT * FROM table2 FOR XML RAW('product'), ROOT('productDetails'), TYPE );
- 这里的
TYPE参数会让查询返回原生的XML类型数据,如果你的column1定义为XML类型,这个参数很有用;如果column1是字符串类型(比如nvarchar(max)),可以去掉TYPE,或者用CAST/CONVERT转换类型。
方法二:先将XML存入变量再插入
如果需要对XML做额外处理,或者更清晰地控制流程,可以先把生成的XML存入变量,再执行插入:
DECLARE @xmlData XML; -- 生成XML并赋值给变量 SET @xmlData = ( SELECT * FROM table2 FOR XML RAW('product'), ROOT('productDetails') ); -- 插入到目标表 INSERT INTO table1 (column1) VALUES (@xmlData);
为什么原语句会报错?
原语句中SELECT * FROM table2 FOR XML ...的写法,SQL Server会把它当成一个行集来处理,而不是单个值。但INSERT INTO table1 (column1)只需要一个列的单个值,所以必须把FOR XML的结果包装成能返回单个标量值的形式,这就是上面两种方法的核心思路。
内容的提问来源于stack exchange,提问作者Vinodh Muthusamy
相关产品推荐
相关产品推荐

