2010-01-25 55 views
6

我想在SQL Server中創建一個視圖,該視圖組合了多個數據庫元數據。元數據的從TSQL視圖中的數據行執行字符串連接(數據透視?)

其中的一塊,我想在sys.syscomments表生活 - 在培訓相關列如下:

id colid text 
---- ------ ------------- 
1001 1  A comment. 
1002 1  This is a lo 
1002 2  ng comment. 
1003 1  This is an e 
1003 2  ven longer c 
1003 3  omment! 

正如你可以看到在「文本」列中的數據,如果它通過拆分成多行最大長度(在SQL Server中爲8000字節/ 4000個字符,在我的示例中爲12個字符)。 colid標識將文本組裝到一起的順序。

我想提出的查詢/子查詢在我看來,以重組從sys.syscomments表的意見,讓我有:

id comment (nvarchar(max)) 
---- ---------------------------------- 
1001 A comment. 
1002 This is a long comment. 
1003 This is an even longer comment! 

任何建議或解決方案?速度沒有任何關鍵性,但簡單和低影響(我想避免CLR函數等 - 理想情況下整個事情將被包含在視圖定義中)。我研究了一些基於XML的建議,但結果產生了充滿XML轉義字符串的文本。

回答

13
SELECT id, 
     (
     SELECT text AS [text()] 
     FROM mytable mi 
     WHERE mi.id = md.id 
     ORDER BY 
       mi.col 
     FOR XML PATH(''), TYPE 
     ).value('/', 'NVARCHAR(MAX)') 
FROM (
     SELECT DISTINCT id 
     FROM mytable 
     ) md 
+0

正如在問題中提到,我已經走了這條路線。結果是文本充斥着XMl轉義序列,從邏輯比較運算符到新行都有。這種亂碼輸出不適合進一步的操作,如LIKE搜索。 – David 2010-01-25 18:04:18

+0

'@ David':查看帖子更新。 – Quassnoi 2010-01-25 18:14:34

+0

謝謝。這更有幫助。 – David 2010-01-25 18:20:31

1

爲什麼不使用sys.sql_modules定義列,其數據存儲作爲單個nvarchar(最大)?

而不是閱讀幾個syscomments文本(nvarchar(4000))列分散在幾行,並不得不連接。

SELECT object_id, definition FROM sys.sql_modules 

只是一個想法......你是說簡單的:-)