2010-01-25 16 views
6

SQL Server'da birkaç veritabanı meta verisini bir araya getiren bir görünüm oluşturmak istiyorum. metaBir TSQL görünümündeki veri satırlarından dize birleştirme gerçekleştiriliyor (pivot?)

Tek parça ben sys.syscomments tabloda hayatlarını istiyoruz - aşağıdaki gibidir Alakalı sütunlar şunlardır: geçene eğer "metin" sütunundaki verileri görebileceğiniz gibi

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! 

birden fazla satıra bölünür Maksimum uzunluk (SQL Server'da 8000 bayt/4000 karakter, örneğimde 12 karakter). colid, metni bir araya getirme sırasını tanımlar.

Ben var ki, sys.syscomments tablosundan yorumlarınızı yeniden birleştirmek için bana göre sorgu/alt sorgu yapmak istiyorum

:

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

Herhangi öneri veya çözüm? Hız hiçbir şekilde kritik değildir, ancak basitlik ve düşük etki (CLR işlevlerinden ve benzerlerinden kaçınmak isterim - ideal olarak tüm şey görünüm tanımına dahil edilir). Bazı XML tabanlı önerilere baktım, ancak sonuçlar XML kaçış dizeleriyle dolu metinler üretti.

cevap

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

, ben zaten bu rota aşağı gitmiş basit :-) dediniz. Sonuç, mantıksal karşılaştırma operatörlerinden yeni satırlara kadar her şey için XMl çıkış dizileriyle karıştırılan metindir. Bu bozuk çıkış, LIKE aramaları gibi diğer işlemler için uygun değildir. – David

+0

'David': gönderi güncellemesine bakın. – Quassnoi

+0

Teşekkürler. Bu çok daha yararlı oldu. – David

1

Neden Bir tek nvarchar (max) gibi verileri saklayan sys.sql_modules tanım sütunları kullanmaz Bu makale konu hakkında iyi bir tartışma vardır? Bunun yerine birkaç syscomments metin okuma

(nvarchar (4000)) sütunları birkaç satır yayılmış ve bitiştirmek zorunda.

SELECT object_id, definition FROM sys.sql_modules 

Sadece bir düşünce

... Söz konusu belirtildiği gibi