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?


94

Trong cơ sở dữ liệu SQL Server 2008 (bản dựng 10.0.1600) trực tiếp này, có một Eventsbảng chứa một textcột có tên Details. (Có, tôi nhận ra đây thực sự phải là một varchar(MAX)cột, nhưng bất kỳ ai thiết lập cơ sở dữ liệu này đã không làm theo cách đó.)

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

Tôi đã đọc ở nhiều vị trí khác nhau trên Internet rằng bạn có thể đặt các ký tự tối đa được lấy cho dữ liệu XML Tools > Options > Query Results > SQL Server > Results To Gridthành Không giới hạn, rồi thực hiện truy vấn như sau:

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

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

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

Không thể hiển thị XML. Đã xảy ra lỗi sau: Đã xảy ra kết thúc tệp không mong muốn. Dòng 5, vị trí 220160.

Một giải pháp là tăng số lượng ký tự được truy xuất từ ​​máy chủ cho dữ liệu XML. Để thay đổi cài đặt này, trên menu Công cụ, bấm vào Tùy chọn.

Vì vậy, bất kỳ ý tưởng về cách truy cập dữ liệu này? Liệu chuyển đổi cột để varchar(MAX)khắc phục tai ương của tôi?

Câu trả lời:


97

SSMS chỉ cho phép dữ liệu không giới hạn đối với dữ liệu XML. Đây không phải là mặc định và cần được đặt trong các tùy chọn.

nhập mô tả hình ảnh ở đây

Một thủ thuật có thể hoạt động trong những trường hợp khá hạn chế là chỉ cần đặt tên cột theo một cách đặc biệt như bên dưới để nó được coi là dữ liệu XML.

DECLARE @S varchar(max) = 'A'

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

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

Trong SSMS (ít nhất là phiên bản 2012 đến hiện tại là 18.3), điều này hiển thị kết quả như bên dưới

nhập mô tả hình ảnh ở đây

Nhấp vào nó sẽ mở ra toàn bộ kết quả trong trình xem XML. Cuộn sang phải hiển thị 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 đều được nối với hàng đầ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.

Dưới đây là một cách mạnh mẽ hơn để tránh sự cố SQL Server chuyển đổi <thành &lt;vv hoặc không thành công do các ký tự này (ghi có Adam Machanic tại đây ).

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 Convert đã hoạt động! Cảm ơn rất nhiều. :)
adamjford

Việc thêm CDATAcó 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 đang sử dụng Bộ phân tách đơn vị, Mã ASCII 31, trong dữ liệu của mình. Vì tôi chỉ sử dụng một ký tự đó ở nhiều nơi, nên đơn giản là REPLACE(details, char(31), '&x1f;')đủ. 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

@Zarepheth - Đây CDATAlà gợi ý đầu tiên của tôi. Người sau AS [processing-instruction(x)]tránh điều đó.
Martin Smith

1
@MartinSmith câu trả lời xuất sắc! Tự hỏi tôi học được bao nhiêu từ câu trả lời của bạn! +1
Kin Shah

50

Tôi đã có thể làm cho điều này hoạt động ...

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

25

Một cách giải quyết 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 ...". Thao tác này xuất nó sang tệp 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.

Cách giải quyết


10

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

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

  1. đặt tùy chọn truy vấn thành "Kết quả thành lưới", 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ả dưới dạng tệp bất kỳ

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 trường varchar (MAX)

Kết quả trong một tệp


1
Thẳng - dễ dàng - và luôn luôn bị lãng quên cho đến khi bạn cần nó nữa :)
Dimi Takis

5

Cách giải quyết đơn giản nhất mà 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 vào cơ sở dữ liệu của bạn và chọn Tasks>Generate Scripts...
  2. Nhấp vào trang "Giới thiệu" Next
  3. Trang "Chọn đối tượng"
    1. Chọn Select specific database objectsvà chọn bảng của bạn.
    2. Nhấp chuột Next
  4. Trang "Đặt Tùy chọn Tập lệnh"
    1. Đặt loại đầu ra thành Save scripts to a specific location
    2. Chọn Save to filevà điền vào các tùy chọn liên quan
    3. Bấm vào Advancednút
    4. Đặt General> Types of data to scriptthành Data onlyhoặc Schema and Datavà nhấp vào ok
    5. Nhấp chuột Next
  5. "Trang Tóm tắt" nhấp vào tiếp theo
  6. Tập lệnh sql của bạn sẽ được tạo dựa trên các tùy chọn bạn đã đặt trong 4.2. Mở tệp này lên và xem dữ liệu của bạn.

3

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

ntext, văn bản và hình ảnh (Transact-SQL)

Các kiểu dữ liệu ntext, văn bản và hình ảnh sẽ bị xóa trong phiên bản Microsoft SQL Server trong tương lai. Tránh sử dụng các loại dữ liệu này trong công việc phát triển mới và lên kế hoạch sửa đổi các ứng dụng hiện đang sử dụng chúng. Thay vào đó hãy sử dụng nvarchar (max), varchar (max) và varbinary (max).

bạn cần sử dụng TEXTPTR (Transact-SQL) để truy xuất dữ liệu văn bản.

Cũng xem bài viết này về Xử lý Kiểu Dữ liệu Văn bản .


Việc chuyển đổi cột có varchar(MAX)ngăn SSMS cắt bớt dữ liệu khỏi cột đó không?
adamjford

Đầu tiên tôi sẽ sử dụng SSMS để tạo tập lệnh để chuyển đổi cột TEXT của bạn thành varchar (max). Từ đó, bạn có thể đánh giá xem bạn có muốn chuyển đổi thêm nó thành một cột XML hay không. Đối với giới hạn hiển thị SSMS, kết quả thành 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 không giới hạn số lượng dữ liệu xml (fyi, cột bảng thuộc loại XML chỉ có thể lưu trữ 2 GB). Trong khi kết quả cho văn bản được giới hạn ở 8192 ký tự trên 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 menu CÔNG CỤ (trong SSMS), sau đó TÙY CHỌN ... rồi đến KẾT QUẢ CÂU HỎI, sau đó là SQL SERVER, sau đó là KẾT QUẢ ĐẾN GRID hoặc KẾT QUẢ ĐẾN VĂN BẢN.
KM.

3

Có vẻ như Xml có thể không được định hình tốt. Nếu đúng như vậy, thì bạn sẽ không thể truyền nó dưới dạng Xml và do đó, bạn bị giới hạn về lượng văn bản có thể trả lại trong Management Studio. Tuy nhiên, bạn có thể chia văn bản thành các phầ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 chúng lại theo cách thủ công.

BIÊN TẬP

Có vẻ như có một số ký tự trong textdữ liệu mà trình 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ử Convert(xml, data)thủ thuật. Vì vậy, một cái gì đó như:

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

(Tôi cần truyền thành varchar (max) vì hàm thay thế sẽ không hoạt động trên textcác cột. Không có lý do gì bạn không thể chuyển đổi các textcột đó thành varchar(max).)


Ồ, tôi cho rằng tôi nên đề cập rằng cột này không phải là XML. CHUYỂN ĐỔI cột thành XML chỉ là một cách giải quyết mà tôi đã tìm thấy từ Google mà người khác đã sử dụng để vượt qua giới hạn mà SSMS có từ việc truy xuất dữ liệu từ một texthoặc varchar(MAX)cột.
adamjford

1
CHỈNH SỬA mã của bạn ở trên; Với Tally As (Chọn ROW_NUMBER () HẾT (ORDER BY s1.id) - 1 As Num Từ sys.sysobjects As s1 Cross Join sys.sysobjects As s2) Chọn Chuỗi con (T1.YourTextCol, T2.Num * 8000 + 1, 8000) Từ YourTable Như T1 Chữ thập Tham Tally Như T2 đâu T2.Num <= trần (datalength (T1.YourTextCol) / 8000) Sắp xếp theo T2.Num
Ian Quigley

Sử dụng TSQLtừ @IanQuigley dựa trên câu trả lời này hiệu quả đối với tôi. Về cơ bản, tôi đã lấy kết quả (cuối cùng là 11 bản ghi) và chỉ dán chúng lại với nhau trong Notepad. Hoạt động 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 rồ bao gồm các ký tự không hợp lệ.
atconway,

1

Tôi thích cách hack XML đơn giản này làm cho các cột có thể nhấp được trong SSMS trên cơ sở từng ô. 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 toàn bộ giá trị khi chúng thú vị. Điều này giống 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
;

Lưu ý rằng một số ký tự không hợp lệ trong XML 1.0 nhưng hợp lệ trong NVARCHAR/ VARCHAR. Ví dụ: ký tự NUL (khác NULLvới giá trị của trường). Quá trình ép kiểu sẽ không thành công đối với các chuỗi có các giá trị được nhúng như vậy.
binki

1

Bắt đầu từ SSMS 18.2, giờ đây bạn có thể xem tới 2 triệu ký tự trong kết quả lưới. Nguồn

Cho phép hiển thị nhiều dữ liệu hơn (Kết quả thành Văn bản) và lưu trữ trong các ô (Kết quả thành Lưới). SSMS hiện cho phép tối đa 2 triệu ký tự cho cả hai.

Tôi đã xác minh điều này bằng mã bên dưới.

DECLARE @S varchar(max) = 'A'

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

SELECT @S as a

1
Các ký tự tối đa thực sự là 2097152 ( trong phiên bản SSMS 15.0.18333.0 ).
stomy

0

Tôi nghĩ là bạn đã hết may mắn. Vấn đề này không phải là vấn đề mức SQL như tất cả các câu trả lời khác dường như tập trung vào, mà 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 có mục đích chung / chung. Đó không phải là giao diện của bạn, mà là khu vực quản trị của bạn và nó có những hạn chế nghiêm trọng trong việc xử lý dữ liệu nhị phân và dữ liệu thử nghiệm lớn - bởi vì những người sử dụng nó trong hồ sơ sử dụng được chỉ định sẽ không gặp sự cố này.

Trình bày dữ liệu văn bản lớn không phải là cách sử dụng theo kế hoạch.

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


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

Câu trả lời này sẽ bị xóa vì nó không còn được áp dụng nữa
Caius Jard
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.