背景
最近做一報表,因為查詢的SQL很長很復雜,導致直接查詢出現異常,后來想到將大量重復的只是查詢條件不同的子查詢放到函數中去做,無奈需要的參數不能傳進函數中,因為參數格式類似如:'ProjGUID1','ProjGUID2' 這樣,這是報表工具生成的,無法修改。現在就要想辦法讓參數能傳進函數中或是換用其他的方式。
思路
1、首先想到的是用存儲過程,但是在報表工具中調試不通,存儲過程不能得到有效的執行,可能是根本就不支持存儲過程;
2、將參數作為in的條件,查詢出符合條件的GUID,返回的是一個表,然后循環表的行記錄,拼接GUID傳入函數,但是報表工具中的SQL不支持定義變量和臨時表,此方法也行不通;
3、利用SQL語句的For Xml 將GUID查詢成一個XML結構的字符串,但傳入函數中后解析該XML需要用到系統存儲過程sp_xml_preparedocument ,函數中並不支持調用存儲過程,此路也不通。關於SQL中解析XML可以參見我之前的博文《使用sp_xml_preparedocument處理XML文檔》。
解決方法
上面說到了SQL的For Xml可以將查詢的列轉換成XML結構的字符串,還有一種方法可以將查詢的字段轉換成以特定符號隔開的字符串,那就是For Xml Path:
SELECT TOP 2 CONVERT(VARCHAR(40),ProjGUID)+',' FROM p_Project FOR XML PATH('')
上面的語句得到的結果如下:
BAA95B67-FC41-4A78-AF1C-014BBE0AC368,37641496-23AA-46CB-9817-027AA120F5C6,
至此問題解決,這樣的字符串是可以傳進函數的,只需將最后的逗號去掉即可。