2010-01-25 4 views
6

Tôi muốn tạo chế độ xem trong SQL Server kết hợp một vài phần siêu dữ liệu của cơ sở dữ liệu.Thực hiện ghép nối chuỗi từ các hàng dữ liệu trong chế độ xem TSQL (trục?)

Một phần siêu dữ liệu tôi muốn cuộc sống trong bảng sys.syscomments - các cột có liên quan như sau:

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! 

Như bạn có thể xem dữ liệu trong cột "text" được chia thành nhiều hàng nếu nó đi độ dài tối đa (8000 byte/4000 ký tự trong SQL Server, 12 ký tự trong ví dụ của tôi). colid xác định thứ tự để ráp lại văn bản.

Tôi muốn thực hiện truy vấn/subquery trong quan điểm của tôi để làm lại các ý kiến ​​từ bảng sys.syscomments, vì vậy mà tôi có:

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

Mọi góp ý hoặc các giải pháp? Tốc độ không phải là bất kỳ cách nào quan trọng, nhưng đơn giản và tác động thấp là (tôi muốn tránh các chức năng CLR và tương tự - lý tưởng là toàn bộ điều sẽ được bao bọc trong định nghĩa khung nhìn). Tôi đã xem xét một số đề xuất dựa trên XML, nhưng kết quả đã tạo ra văn bản chứa đầy chuỗi thoát XML.

Trả lời

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

Như đã đề cập trong câu hỏi, tôi đã đi xuống tuyến đường này. Kết quả là văn bản được riddled với chuỗi thoát XMl cho tất cả mọi thứ từ từ các nhà khai thác so sánh logic để dòng mới. Sản lượng bị cắt xén này không thích hợp cho các hoạt động tiếp theo như tìm kiếm LIKE. – David

+0

'@ David': xem bài đăng cập nhật. – Quassnoi

+0

Cảm ơn bạn. Điều này hữu ích hơn nhiều. – David

1

Tại sao không sử dụng các cột sys.sql_modules định nghĩa mà các cửa hàng dữ liệu như một nvarchar duy nhất (max)?

Thay vì đọc một số văn bản syscomments văn bản (nvarchar (4000)) cột trải rộng trên nhiều hàng và phải nối.

SELECT object_id, definition FROM sys.sql_modules 

Chỉ cần một ý nghĩ ... Anh nói đơn giản :-)