2010-05-03 42 views
71

Trong cơ sở dữ liệu SQL Server 2008 (xây dựng 10.0.1600) trực tiếp này, có một bảng Events, có chứa một cột text có tên là Details. (Có, tôi nhận ra điều này thực sự là một cột varchar(MAX), nhưng bất cứ ai thiết lập cơ sở dữ liệu này không làm theo cách đó.)Làm cách nào để xem toàn bộ nội dung của cột văn bản hoặc varchar (MAX) trong SQL Server 2008 Management Studio?

Cột này chứa rất nhiều ngoại lệ và dữ liệu JSON liên quan mà tôi đang cố gắng truy cập thông qua SQL Server Management Studio, nhưng bất cứ khi nào tôi sao chép các kết quả từ lưới vào một trình soạn thảo văn bản, nó cắt nó ở 43679 ký tự.

Tôi đã đọc trên các địa điểm khác nhau trên Internet mà bạn có thể thiết lập nhân vật tối đa của bạn Lấy cho dữ liệu XML trong Tools > Options > Query Results > SQL Server > Results To Grid để không giới hạn, và sau đó thực hiện một truy vấn như thế này:

select Convert(xml, Details) from Events 
where EventID = 13920 

(Lưu ý rằng CONVERT nhập cột vào XML chỉ là một cách giải quyết mà tôi tìm thấy từ Googling mà người khác đã sử dụng để thu thập giới hạn SSMS có từ việc lấy dữ liệu từ cột text hoặc varchar(MAX).)

Tuy nhiên, sau khi đặt tùy chọn ở trên, hãy chạy truy vấn, và nhấp vào liên kết trong kết quả, tôi vẫn nhận được lỗi sau:

Unable to show XML. The following error happened: Unexpected end of file has occurred. Line 5, position 220160.

One solution is to increase the number of characters retrieved from the server for XML data. To change this setting, on the Tools menu, click Options.

Vì vậy, bất kỳ ý tưởng về làm thế nào để truy cập dữ liệu này? Biến đổi cột thành varchar(MAX) có khắc phục được sự cố của tôi không?

+0

Tôi đã từng có một tiện ích tùy chỉnh bằng văn bản chỉ dành riêng cho mục đích truy cập vào các lĩnh vực văn bản. Nó rất khó chịu. – Jaxidian

Trả lời

76

Một mẹo có thể hoạt động trong các trường hợp khá hạn chế chỉ đơn giản là đặt tên cột theo cách đặc biệt như dưới đây.

DECLARE @S varchar(max) = 'A' 

SET @S = REPLICATE(@S,100000) + 'B' 

SELECT @S as [XML_F52E2B61-18A1-11d1-B105-00805F49916B] 

Trong SSMS năm 2012 và 2014 này sẽ hiển thị các kết quả như sau

enter image description here

Nhấp vào nó sẽ mở ra kết quả đầy đủ trong trình xem XML. Cuộn sang phải cho thấy ký tự cuối cùng của B được giữ nguyên,

Tuy nhiên, điều này có một số vấn đề đáng kể. Việc thêm các cột bổ sung vào truy vấn sẽ phá vỡ hiệu ứng và các hàng bổ sung tất cả được ghép nối với cột đầu tiên. Cuối cùng, nếu chuỗi chứa các ký tự như < mở trình xem XML không thành công với lỗi phân tích cú pháp.

Một cách mạnh mẽ hơn để làm điều này tránh các sự cố của SQL Server chuyển đổi < thành &lt; v.v. hoặc do các ký tự này ở bên dưới (credit Adam Machanic here).

DECLARE @S varchar(max) 

SELECT @S = '' 

SELECT @S = @S + ' 
' + OBJECT_DEFINITION(OBJECT_ID) FROM SYS.PROCEDURES 

SELECT @S AS [processing-instruction(x)] FOR XML PATH('') 
+2

Thêm CDATA vào câu lệnh Chuyển đổi đã hoạt động! Cảm ơn rất nhiều. :) – adamjford

+0

Việc thêm 'CDATA' có thể hoạt động, nhưng nếu dữ liệu của bạn bao gồm các ký tự điều khiển, bạn phải thực hiện thao tác thay thế. Trong trường hợp của tôi, tôi đã sử dụng Bộ tách Đơn vị, Mã ASCII 31, trong dữ liệu của tôi. Vì tôi chỉ sử dụng một ký tự đó ở nhiều nơi, nên đơn giản 'REPLACE (chi tiết, char (31), '&x1f;')' sufficed. Nếu tôi có các ký tự không xác định hoặc một số lượng lớn các ký tự khác nhau để thay thế, tôi có thể phải tìm một giải pháp khác. – Zarepheth

+0

@Zarepheth - Điều 'CDATA' là gợi ý đầu tiên của tôi. Cái sau của 'AS [xử lý-lệnh (x)]' tránh điều đó. –

2

Có vẻ như Xml có thể không được định dạng tốt. Nếu đó là trường hợp, sau đó bạn sẽ không thể đúc nó như Xml và cho rằng, bạn bị giới hạn trong bao nhiêu văn bản bạn có thể quay trở lại trong Management Studio. Tuy nhiên, bạn có thể chia nhỏ văn bản thành các đoạn nhỏ hơn như vậy:

With Tally As 
    (
     Select ROW_NUMBER() OVER (ORDER BY s1.object_id) - 1 As Num 
     From sys.sysobjects As s1 
      Cross Join sys.sysobjects As s2 
    ) 
Select Substring(T1.textCol, T2.Num * 8000 + 1, 8000) 
From Table As T1 
    Cross Join Tally As T2 
Where T2.Num <= Ceiling(Len(T1.textCol)/8000) 
Order By T2.Num 

Sau đó, bạn sẽ cần phải kết hợp lại chúng theo cách thủ công.

EDIT

Nghe có vẻ như có một số nhân vật trong các dữ liệu text rằng phân tích cú pháp Xml không thích. Bạn có thể thử chuyển đổi các giá trị đó thành các thực thể và sau đó thử thủ thuật Convert(xml, data). Vì vậy, một cái gì đó như:

Update Table 
Set Data = Replace(Cast(Data As varchar(max)),'<','&lt;') 

(tôi cần để cast để varchar (max) vì thay thế chức năng sẽ không hoạt động trên text cột Không nên có lý do nào đó bạn không thể chuyển đổi các cột text-varchar(max)..)

+0

Ồ, tôi cho rằng tôi nên đề cập đến rằng cột không phải là XML cả. Chuyển đổi cột thành XML chỉ đơn thuần là một giải pháp mà tôi tìm thấy từ Googling mà người khác đã sử dụng để vượt qua giới hạn SSMS có từ việc truy xuất dữ liệu từ cột 'text' hoặc' varchar (MAX) '. – adamjford

+1

EDIT mã của bạn ở trên; Với Tally Như ( Chọn ROW_NUMBER() OVER (ORDER BY s1.id) - 1 Như Num Từ sys.sysobjects Như s1 Chữ thập Tham sys.sysobjects Như s2 ) Chọn substring (T1.YourTextCol, T2.Num * 8000 + 1, 8000) Từ Bảng điều khiển của bạn Là T1 Tham gia chéo Tally như T2 Nơi T2.Num <= Trần (datalength (T1.YourTextCol)/8000) Đặt hàng Bằng T2.Num –

+0

Sử dụng 'TSQL' từ @IanQuigley dựa trên câu trả lời này làm việc tốt cho tôi. Tôi về cơ bản đã lấy kết quả (cuối cùng là 11 hồ sơ) và chỉ dán chúng lại với nhau trong Notepad. Làm việc hoàn hảo. Cần lưu tập lệnh này. Tôi đã có một số XML dài điên bao gồm các ký tự không hợp lệ. – atconway

2

Kiểu dữ liệu TEXT cũ và không nên được sử dụng nữa, thật khó để chọn dữ liệu ra khỏi cột TEXT.

ntext, text, and image (Transact-SQL)

ntext, text, and image data types will be removed in a future version of Microsoft SQL Server. Avoid using these data types in new development work, and plan to modify applications that currently use them. Use nvarchar(max), varchar(max), and varbinary(max) instead.

bạn cần phải sử dụng TEXTPTR (Transact-SQL) để lấy dữ liệu văn bản.

Đồng thời xem bài viết này trên Handling The Text Data Type.

+0

Liệu việc chuyển đổi cột thành 'varchar (MAX)' có ngăn SSMS cắt bớt dữ liệu khỏi nó? – adamjford

+0

Lần đầu tiên tôi sử dụng SSMS để tạo đoạn mã để chuyển đổi cột TEXT thành varchar (max). Từ đó bạn có thể đánh giá nếu bạn muốn chuyển đổi nó sang một cột XML. Đối với giới hạn hiển thị SSMS, kết quả cho lưới có thể được đặt để hiển thị tối đa 65,535 ký tự dữ liệu không phải xml trên mỗi cột và tối đa số lượng dữ liệu xml không giới hạn (fyi, cột bảng loại XML chỉ có thể lưu trữ 2 GB). Mặc dù kết quả cho văn bản được giới hạn trong 8192 ký tự mỗi cột. Để đặt các giới hạn tối đa mặc định này, chỉ cần đi tới (trong SSMS) menu TOOLS, sau đó chọn OPTIONS ... rồi QUERY KẾT QUẢ, sau đó SQL SERVER, sau đó KẾT QUẢ CHO GRID hoặc KẾT QUẢ TEXT. –

0

Bạn đang rất may mắn, tôi nghĩ vậy.Vấn đề không phải là một vấn đề cấp SQL như tất cả các câu trả lời khác dường như tập trung vào, nhưng chỉ đơn giản là một trong những giao diện người dùng. Management Studio không có nghĩa là một giao diện truy cập dữ liệu chung/mục đích chung. Nó không phải là giao diện của bạn, mà là khu vực hành chính của bạn, và nó có những hạn chế nghiêm trọng xử lý dữ liệu nhị phân và dữ liệu thử nghiệm lớn - bởi vì mọi người sử dụng nó trong hồ sơ sử dụng được chỉ định sẽ không chạy vào vấn đề này.

Trình bày dữ liệu văn bản lớn chỉ đơn giản là không sử dụng theo kế hoạch.

Lựa chọn duy nhất của bạn sẽ là một hàm có giá trị bảng lấy đầu vào văn bản và cắt các hàng cho mỗi dòng, sao cho Management Studio nhận được danh sách các hàng chứ không phải một hàng.

+0

Tôi cảm thấy như câu trả lời này là phỏng đoán tốt nhất, hoặc bạn có bất kỳ nguồn nào cho "sử dụng theo kế hoạch"? Nếu đó là một "studio quản lý" SQL thì ít nhất nó cũng có thể hiển thị cho tôi nội dung cơ sở dữ liệu của tôi. UI hoàn toàn khủng khiếp. – damd

4

Cách giải quyết đơn giản nhất tôi tìm thấy là sao lưu bảng và xem tập lệnh. Để làm điều này

  1. Nhấp chuột phải cơ sở dữ liệu của bạn và chọn Tasks>Generate Scripts...
  2. trang "Giới thiệu" nhấp chuột Next
  3. "Chọn đối tượng" trang
    1. Chọn Select specific database objects và chọn bảng của bạn.
    2. Bấm Next
  4. "Đặt Scripting Options" trang
    1. Đặt loại đầu ra để Save scripts to a specific location
    2. Chọn Save to file và điền vào các tùy chọn liên quan
    3. Nhấp vào nút Advanced
    4. Đặt General >Types of data to script đến Data only hoặc Schema and Data và nhấp vào ok
    5. Bấm Next
  5. "Tóm tắt thông tin trang" click tiếp theo
  6. script sql của bạn nên được tạo ra dựa trên các tùy chọn bạn đã đặt trong 4.2. Mở tệp này và xem dữ liệu của bạn.
+0

Cảm ơn bạn - điều này đã hoạt động tốt! – skiphoppy

28

tôi đã có thể có được điều này để làm việc ...

SELECT CAST('<![CDATA[' + LargeTextColumn + ']]>' AS XML) FROM TableName; 
0

Tôi thích hack này XML đơn giản mà làm cho cột nhấp được trong SSMS trên cơ sở tế bào của tế bào. Với phương pháp này, bạn có thể xem nhanh dữ liệu của mình trong chế độ xem dạng bảng của SSMS và nhấp vào các ô cụ thể để xem giá trị đầy đủ khi chúng thú vị. Điều này giống hệt với kỹ thuật của OP, ngoại trừ việc nó tránh được các lỗi XML.

SELECT 
    e.EventID 
    ,CAST(REPLACE(REPLACE(e.Details, '&', '&amp;'), '<', '&lt;') AS XML) Details 
FROM Events e 
WHERE 1=1 
AND e.EventID BETWEEN 13920 AND 13930 
; 
6

Một công việc xung quanh là nhấp chuột phải vào tập hợp kết quả và chọn "Lưu kết quả dưới dạng ...". Điều này xuất khẩu nó vào một tập tin CSV với toàn bộ nội dung của cột. Không hoàn hảo nhưng làm việc đủ tốt cho tôi.

Workaround

0

Bạn đã thử giải pháp đơn giản này chưa? Chỉ có 2 lần nhấp chuột!

Tại cửa sổ truy vấn,

  1. tùy chọn thiết lập truy vấn để "Kết quả to Grid", chạy truy vấn của bạn
  2. Nhấp chuột phải vào tab kết quả ở góc lưới, lưu kết quả như bất kỳ tập tin

Bạn sẽ nhận được tất cả văn bản bạn muốn xem trong tệp !!! Tôi có thể thấy 130.556 ký tự cho kết quả của tôi về một lĩnh vực varchar (MAX)

Results in a file

Các vấn đề liên quan