读别人写的东西,无意中看到这样一句话

   select @str=stuff((select ','+vc_product_name from #temptable for xml path('')),1,1,'')

   在sqlserver的存储过程中执行了一下可以把临时表#temptable 中的vc_product_name取出来并用‘,’号隔开并赋值给字符串,用以返回错误信息。很巧妙的用法,在网上搜索了一下解释是:“这一整句的作用是将多行vc_product_name字段的内容串联起来,用逗号分隔。”


   先查stuff 函数,在指定的起点处删除指定长度的字符并插入另一组字符,显然是staff(****,1,1,'')的用法,应该是去掉括号中的第一个字符。


   不过 fro xml path的用法之前真没见过,用sqlserver的联机帮助查了一下,原来是sqlserver 2005以上的版本可以将查询结果集以xml形式展现(PS,当看到xml的时候也是一头雾水,这是我的硬伤,对前台页面语言诸如此类一窍不通,不过简单百度了一下,了解到应该和html类似)。

   自己写了三个语句,用于理解这个用法:

   select vc_product_name from #temptable for xml path

   select vc_product_name from #temptable for xml path('')

   select ','+vc_product_name from #temptable for xml path('')


   执行第一句,结果以<row><vc_product_name>分割#temptable 表中的vc_product_name列;

   执行第二句,结果以<vc_product_name>分割#temptable 表中的vc_product_name列,显然语句最后的('')可以替换xml语句中的<row>;

   执行第三句,结果以‘,’分割#temptable 表中的vc_product_name列,显然select后面的‘,’用以做分隔符,而path 后的('')的替换xml语句中的<row>。


   这个用法因为之前没有见过,觉得很新鲜,而且在存储过程中赋给变量用以返回错误信息,用法很巧妙。