沒有XML編碼的SQLXML?
.該解決方案使用SQLXML來合併資料(子查詢):
SELECT STUFF( (SELECT ', ' + Name FROM MyTable _in WHERE _in.ID = _out.ID FOR XML PATH('')),-- Output multiple rows as one xml type value, -- without xml tags 1, 2, '')-- STUFF: Replace the comma at the beginning with empty string FROM MyTable _out GROUP BY ID-- Removes duplicates
這完美的工作(甚至沒有那麼沉重的表現),除了我的資料現在通過SQLXML獲得XML編碼(& =& amp; amp; amp; amp;等) – 我不想要XML資料,我只是把它用作一個詭計 – 由於通用系統,我無法對其進行編碼以將其清理乾淨,因此編碼資料直接轉到報告中.我不能使用通用系統的儲存過程,所以CURSOR合併或COALESCE-ing在這裡不是一個選項…
所以我正在尋找的是T-SQL中的一種方式,可以讓我再次解碼XML,甚至更好:避免SQLXML進行編碼.顯然,我可以編寫一個這樣做的儲存函式,但是我更喜歡內建,更安全的方式…
謝謝你的幫助…
如果將型別指定為xml的選項,則可以使用XPath查詢將XML型別轉換回varchar.使用示例表變數:
declare @MyTable table (id int, name varchar(50)) insert @MyTable (id, name) select 1, 'Joel & Jeff' union all select 1, '<<BIN LADEN>>' union all select 2, '&&BUSH&&'
一個可能的解決方案是:
selectb.txt.query('root').value('.', 'varchar(max)') from( selectdistinct id from@MyTable ) a cross apply ( selectCASE ROW_NUMBER() OVER(ORDER BY id) WHEN 1 THEN '' ELSE ', ' END + name from@MyTable whereid = a.id order by id for xml path(''), root('root'), type ) b(txt)
這將列印:
Joel & Jeff, <<BIN LADEN>> &&BUSH&&
這是一個沒有XML轉換的替代方案.它確實有一個遞迴查詢,所以效能里程可能會有所不同.是從Quassnoi’s blog :
;WITHwith_stats(id, name, rn, cnt) AS ( SELECTid, name, ROW_NUMBER() OVER (PARTITION BY id ORDER BY name), COUNT(*) OVER (PARTITION BY id) FROM@MyTable ), with_concat (id, name, gc, rn, cnt) AS ( SELECTid, name, CAST(name AS VARCHAR(MAX)), rn, cnt FROMwith_stats WHERErn = 1 UNION ALL SELECTwith_stats.id, with_stats.name, CAST(with_concat.gc + ', ' + with_stats.name AS VARCHAR(MAX)), with_stats.rn, with_stats.cnt FROMwith_concat JOINwith_stats ONwith_stats.id = with_concat.id AND with_stats.rn = with_concat.rn + 1 ) SELECTid, gc FROMwith_concat WHERErn = cnt OPTION(MAXRECURSION 0)
http://stackoverflow.com/questions/3202415/sqlxml-without-xml-encoding