<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>For Xml on 冯威的博客</title><link>https://fwhyy.com/tags/for-xml/</link><description>Recent content in For Xml on 冯威的博客</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Tue, 19 Mar 2013 00:00:00 +0800</lastBuildDate><atom:link href="https://fwhyy.com/tags/for-xml/atom.xml" rel="self" type="application/rss+xml"/><item><title>SQL查询-将列转换成字符串（for xml path）</title><link>https://fwhyy.com/2013/03/sql-query-for-xml-path/</link><pubDate>Tue, 19 Mar 2013 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2013/03/sql-query-for-xml-path/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;最近做一报表，因为查询的SQL很长很复杂，导致直接查询出现异常，后来想到将大量重复的只是查询条件不同的子查询放到函数中去做，无奈需要的参数不能传进函数中，因为参数格式类似如：&amp;lsquo;ProjGUID1&amp;rsquo;,&amp;lsquo;ProjGUID2&amp;rsquo; 这样，这是报表工具生成的，无法修改。现在就要想办法让参数能传进函数中或是换用其他的方式。&lt;/p&gt;
&lt;h2 id="思路"&gt;思路&lt;/h2&gt;
&lt;p&gt;1、首先想到的是用存储过程，但是在报表工具中调试不通，存储过程不能得到有效的执行，可能是根本就不支持存储过程；&lt;/p&gt;
&lt;p&gt;2、将参数作为in的条件，查询出符合条件的GUID，返回的是一个表，然后循环表的行记录，拼接GUID传入函数，但是报表工具中的SQL不支持定义变量和临时表，此方法也行不通；&lt;/p&gt;
&lt;p&gt;3、利用SQL语句的For Xml 将GUID查询成一个XML结构的字符串，但传入函数中后解析该XML需要用到系统存储过程sp_xml_preparedocument ，函数中并不支持调用存储过程，此路也不通。关于SQL中解析XML可以参见我之前的博文《&lt;a href="http://blog.fwhyy.com/2011/07/use-sp_xml_preparedocument-processing-xml-documents/"&gt;使用sp_xml_preparedocument处理XML文档&lt;/a&gt;》。&lt;/p&gt;
&lt;h2 id="解决方法"&gt;解决方法&lt;/h2&gt;
&lt;p&gt;上面说到了SQL的For Xml可以将查询的列转换成XML结构的字符串，还有一种方法可以将查询的字段转换成以特定符号隔开的字符串，那就是For Xml Path：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;SELECT TOP 2 CONVERT(VARCHAR(40),ProjGUID)+&amp;#39;,&amp;#39; FROM p_Project FOR XML PATH(&amp;#39;&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;上面的语句得到的结果如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;BAA95B67-FC41-4A78-AF1C-014BBE0AC368,37641496-23AA-46CB-9817-027AA120F5C6,
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;至此问题解决，这样的字符串是可以传进函数的，只需将最后的逗号去掉即可。&lt;/p&gt;</description></item></channel></rss>