Babelfish中XML查询出现多余_x0078_ml元素,求SQL Server兼容方案
兼容SQL Server与Babelfish的XML生成查询
问题说明
创建临时表并插入数据:
create table #emp ( id int, name varchar(10) ); insert into #emp values(1,'A'),(2,'B'); create table #prd ( prid int, price int ); insert into #prd values(1,299),(2,295);
期望生成的XML结构:
<SampleData> <EmpData id="1" name="A" /> <EmpData id="2" name="B" /> <PrdData prid="1" price="299" /> <PrdData prid="2" price="295" /> </SampleData>
原查询在SQL Server中运行正常,但在Babelfish中会生成多余的_x0078_ml包装元素:
SELECT ( SELECT ( SELECT id, name FROM #emp FOR XML RAW('EmpData'),TYPE ), ( SELECT prid, price FROM #prd FOR XML RAW('PrdData'),TYPE ) FOR XML PATH('SampleData'),TYPE );
Babelfish的错误输出:
<SampleData> <_x0078_ml> <EmpData id="1" name="A" /> <EmpData id="2" name="B" /> </_x0078_ml> <_x0078_ml> <PrdData prid="1" price="299" /> <PrdData prid="2" price="295" /> </_x0078_ml> </SampleData>
解决方案
修改查询,去掉多余的嵌套SELECT层级,直接将两个XML子查询作为外层SELECT的输出项,再通过FOR XML PATH('SampleData')合并结果:
SELECT (SELECT id, name FROM #emp FOR XML RAW('EmpData'), TYPE), (SELECT prid, price FROM #prd FOR XML RAW('PrdData'), TYPE) FOR XML PATH('SampleData'), TYPE;
原理说明
Babelfish会为嵌套SELECT中的XML类型列自动生成默认包装元素_x0078_ml(对应"xml"的Unicode转义),而直接将XML子查询作为外层SELECT的输出项时,FOR XML PATH('SampleData')会将两个XML片段直接嵌入根节点,不会添加多余包装。此写法同时兼容SQL Server和Babelfish,能生成符合预期的XML结构。
内容的提问来源于stack exchange,提问作者MAK
相关产品推荐
相关产品推荐

