2009-12-09 39 views
6

Tôi thường muốn thực hiện "kiểm tra nhanh" giá trị của cột văn bản lớn trong SQL Server Management Studio (SSMS). Số ký tự tối đa mà SSMS sẽ cho phép bạn xem, trong chế độ kết quả lưới, là 65535. (Chế độ này thậm chí còn kém hơn trong chế độ kết quả văn bản.) Đôi khi tôi cần thấy một thứ gì đó vượt quá phạm vi đó. Sử dụng SQL Server 2005 cơ sở dữ liệu, tôi thường sử dụng các thủ thuật chuyển đổi nó sang XML, vì SSMS cho phép bạn xem một lượng lớn hơn rất nhiều văn bản như vậy:Xem tất cả văn bản cột ntext trong SQL Server Management Studio cho cơ sở dữ liệu SQL CE

SELECT CONVERT(xml, MyCol) FROM MyTable WHERE ... 

Nhưng bây giờ tôi đang sử dụng SQL CE, và không có Xml loại dữ liệu. Vẫn có giá trị "Tối đa ký tự được truy xuất XML" trong Tùy chọn; Tôi cho rằng điều này rất hữu ích khi kết nối với các nguồn dữ liệu khác.

Tôi biết tôi chỉ có thể nhận được giá trị đầy đủ bằng cách chạy một ứng dụng giao diện điều khiển nhỏ hoặc gì đó, nhưng có cách nào trong SSMS để xem toàn bộ giá trị cột ntext không?

[Chỉnh sửa] OK, điều này không nhận được nhiều sự chú ý lần đầu tiên xung quanh (18 chế độ xem?). Nó không phải là một mối quan tâm lớn, nhưng có lẽ tôi chỉ bị ám ảnh với nó. Có là một số cách tốt đẹp xung quanh điều này, phải không? Vì vậy, một tiền thưởng khiêm tốn đang hoạt động. Những gì tôi sẵn sàng chấp nhận làm câu trả lời, theo thứ tự từ tốt nhất đến xấu nhất:

  1. Một giải pháp hoạt động dễ dàng như lừa XML trong SQL CE. Đó là, một chức năng duy nhất (chuyển đổi, đúc, vv) mà thực hiện công việc.
  2. Cách không xâm lấn để tấn công SSMS để làm cho nó hiển thị nhiều văn bản hơn trong kết quả.
  3. Truy vấn SQL tương đương (có thể là một cái gì đó sử dụng sáng tạo SUBSTRING và tạo nhiều cột đặc biệt ??) để xem kết quả.

Giải pháp sẽ hoạt động với các cột nvarchar và ntext có độ dài bất kỳ trong SQL CE từ SSMS. Bất kỳ ý tưởng?

+0

chuyển đổi thành xml là một mẹo hay. – Shawn

Trả lời

3

Nếu bạn làm việc với CE 3.5 supporting TOP and OUTER APPLY, hãy thử tuyên bố này:

SELECT texts.id, SUBSTRING(texts.text_column, number*100+1, 100) 
FROM 
    (SELECT texts.id, texts.text_column, (99+LEN(texts.text_column))/100 AS l 
    FROM texts) AS texts 
OUTER APPLY 
    (SELECT TOP(l) number 
    FROM master.dbo.spt_values val 
    WHERE name IS NULL 
    ORDER BY number) n 

100 (99) là độ dài văn bản tôi đã sử dụng để thử nghiệm trong dữ liệu của tôi.

+0

Ý tưởng gọn gàng. Tôi không quen với chức năng OUTER APPLY. Thật không may, câu lệnh không hoạt động trong CE, có lẽ vì không có tương đương với một cơ sở dữ liệu chủ. Nhưng tôi thấy những gì đang xảy ra; có thể có một cách khác để lấy số đếm. –

+0

Tôi nghĩ rằng điều này có nhiều hứa hẹn nhất của câu trả lời, vì vậy tôi đánh dấu nó là câu trả lời. Có một ít thời gian hơn cho đến khi tiền thưởng hết hạn, nhưng tôi sẽ đi nghỉ ... :) –

0

Mỗi số này http://msdn.microsoft.com/en-us/library/ms171931.aspx bạn không sử dụng loại XML trong SQL CE. Nó đơn giản không tồn tại. Bạn vẫn nhận được một trường 2GB BLOB ntext nhưng đó không phải là sự giúp đỡ.

chọn ... vì xml hoạt động trong truy vấn ce nhưng có vẻ như lưới vẫn cắt ngắn nó dưới dạng ntext. Để kiểm tra việc tạo một bảng có tên Test với char là nvarchar (4000) và văn bản là các trường ntext. Sử dụng những điều khoản sau đây để điền dữ liệu và gửi lại:

select char, text from test as xml

insert into test (char, text) values (replicate('A',4000), replicate('b',4000) + replicate('B',4000))

tôi nhận được cả hai lĩnh vực cắt xén ở khoảng cùng một chỗ trong chế độ lưới đó sẽ đề nghị nó truncates tại nhiều ít hơn 65535. Loại bỏ các as xml không có hiệu lực vì vậy nó không thực sự đi đến dữ liệu XML anyway.

câu trả lời của bạn:

  1. Bạn không được phép cast nhưng chuyển đổi là hợp lệ. Vấn đề: Không có loại xml trong động cơ. Có thể giải pháp lâu dài: trang trại dữ liệu vào một cơ sở dữ liệu tạm thời SQL Express hoặc nếu không sẽ có được loại thích hợp. Không phải là một công việc nhỏ trừ khi bạn có thể xử lý chi phí.
  2. SSMS đang mở rộng nhưng tôi cho rằng đây không phải là khởi động. Nó là một ứng dụng .NET và có thể được xem trong Reflector nhưng điều đó không gợi ý nhiều.
  3. Mặc dù tùy chọn tồi tệ nhất dường như là dễ nhất từ ​​quan điểm SSMS, thật đáng buồn. Bạn vẫn phải tự động thay đổi kích thước mỗi cột nhưng hy vọng bạn sẽ không chia nhỏ thành hơn 2-3.

Vào cuối ngày, tuy nhiên, tôi không thể không nghĩ rằng tất cả những điều này vẫn sẽ lãng phí thời gian. Có lẽ bạn có thể tìm thấy một công cụ chỉ có SQL CE tốt hơn mà bạn có thể chỉnh sửa lược đồ xem từng cột theo cách phù hợp. Thật đáng buồn là nó thậm chí sẽ đến với điều này nhưng tôi không thấy một lựa chọn dễ dàng hơn.

1

Điều này có thể không lý tưởng, nhưng bạn có thể chia nhỏ nó trong khi xem nó ở chế độ văn bản không?

Ví dụ:

SELECT 
    SUBSTRING(my_text, 1, 8000), 
    SUBSTRING(my_text, 8001, 8000) 
FROM 
    dbo.My_Table 

Nó hoạt động như nó vốn có trong SQL 2008. Đối với năm 2005 bạn sức mạnh cần phải làm một CAST để VARCHAR (MAX) và tôi không chắc chắn nếu điều đó sẽ làm việc như mong đợi hay không.

Tôi vừa mới đưa ra truy vấn sau trong năm 2008 (tôi không có phiên bản CE tiện dụng) và nó hoạt động tốt với độ dài văn bản không xác định (giới hạn 800.000 ký tự mà tôi nghĩ) chỉ muốn hiển thị). Các khối xuất hiện dưới dạng các hàng riêng biệt, vì vậy bạn có thể có trả về vận chuyển ở giữa văn bản của bạn vì điều đó. Tôi không biết đó có phải là vấn đề hay không.

;WITH my_cte AS 
(
    SELECT 
     SUBSTRING(my_text, 1, 8000) AS sub, 
     SUBSTRING(my_text, 8001, LEN(CAST(my_text AS VARCHAR(MAX)))) AS remainder 
    FROM 
     dbo.Test_Text 
    UNION ALL 
    SELECT 
     SUBSTRING(remainder, 1, 8000), 
     SUBSTRING(remainder, 8001, LEN(remainder)) 
    FROM 
     my_cte 
    WHERE 
     LEN(remainder) > 0 
) 
SELECT 
    * 
FROM 
    my_cte 
+0

Thật không may, CTE không được hỗ trợ trong CE. Các SUBSTRING là về tốt nhất tôi đã có thể đi lên với. Đối với đa số trường hợp, điều đó là đủ. Câu hỏi này là một thách thức học tập tại thời điểm này ... –

0

Tôi làm như thế này (bắt đầu mã trong chế độ gỡ lỗi) và sau khi thực hiện lệnh đặt bạn chỉ có thể sao chép văn bản lớn từ cửa sổ gỡ lỗi nơi bạn thấy giá trị @x, nhấp vào Trình hiển thị văn bản/kính lúp:

declare @x varchar(max); 

set @x = (select ioub_application_payload from integrator..tbl_interface_outbound where ioub_iz_id = 74) 

PRINT (@x) 
+0

Điều này có cùng vấn đề với bản in của SQL có giới hạn 8k char. – ProVega

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