2010-01-25 54 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 

只是一个想法......你是说简单的:-)