ฉันจะดูเนื้อหาทั้งหมดของคอลัมน์ข้อความหรือ varchar (MAX) ใน SQL Server 2008 Management Studio ได้อย่างไร


98

ในการนี้สด SQL Server 2008 (สร้าง 10.0.1600) ฐานข้อมูลมีการEventsตารางซึ่งมีคอลัมน์ชื่อtext Details(ใช่ฉันรู้ว่านี่ควรเป็นvarchar(MAX)คอลัมน์ แต่ใครก็ตามที่ตั้งค่าฐานข้อมูลนี้ไม่ได้ทำเช่นนั้น)

คอลัมน์นี้มีบันทึกข้อยกเว้นขนาดใหญ่มากและข้อมูล JSON ที่เกี่ยวข้องซึ่งฉันพยายามเข้าถึงผ่าน SQL Server Management Studio แต่เมื่อใดก็ตามที่ฉันคัดลอกผลลัพธ์จากกริดไปยังโปรแกรมแก้ไขข้อความมันจะตัดทอนที่ 43679 อักขระ

ฉันได้อ่านในสถานที่ต่างๆบนอินเทอร์เน็ตว่าคุณสามารถตั้งค่าอักขระสูงสุดที่ดึงมาสำหรับข้อมูล XML Tools > Options > Query Results > SQL Server > Results To Gridเป็นไม่ จำกัด แล้วดำเนินการค้นหาดังนี้:

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

(โปรดทราบว่าข้อมูลเป็นคอลัมน์ไม่ใช่ XML แต่อย่างใดCONVERTการที่คอลัมน์เป็น XML เป็นเพียงวิธีแก้ปัญหาที่พบจาก Googling ที่มีคนใช้เพื่อหลีกเลี่ยงขีด จำกัด SSMS จากการดึงข้อมูลจากคอลัมน์textหรือvarchar(MAX)คอลัมน์)

อย่างไรก็ตามหลังจากตั้งค่าตัวเลือกด้านบนเรียกใช้แบบสอบถามและคลิกที่ลิงค์ในผลลัพธ์ฉันยังคงได้รับข้อผิดพลาดต่อไปนี้:

ไม่สามารถแสดง XML เกิดข้อผิดพลาดต่อไปนี้: เกิดจุดสิ้นสุดของไฟล์โดยไม่คาดคิด บรรทัดที่ 5 ตำแหน่ง 220160.

วิธีแก้ไขอย่างหนึ่งคือการเพิ่มจำนวนอักขระที่ดึงมาจากเซิร์ฟเวอร์สำหรับข้อมูล XML หากต้องการเปลี่ยนการตั้งค่านี้บนเมนูเครื่องมือคลิกตัวเลือก

ดังนั้นความคิดใด ๆ เกี่ยวกับวิธีการเข้าถึงข้อมูลนี้หรือไม่? การแปลงคอลัมน์เพื่อvarchar(MAX)แก้ไขปัญหาของฉันหรือไม่?

คำตอบ:


98

SSMS อนุญาตเฉพาะข้อมูลแบบไม่ จำกัด สำหรับข้อมูล XML นี่ไม่ใช่ค่าเริ่มต้นและจำเป็นต้องตั้งค่าในตัวเลือก

ป้อนคำอธิบายภาพที่นี่

เคล็ดลับอย่างหนึ่งที่อาจใช้ได้ผลในสถานการณ์ที่ค่อนข้าง จำกัด คือการตั้งชื่อคอลัมน์ในลักษณะพิเศษดังต่อไปนี้เพื่อให้ถือว่าเป็นข้อมูล XML

DECLARE @S varchar(max) = 'A'

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

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

ใน SSMS (อย่างน้อยเวอร์ชัน 2012 ถึงปัจจุบันคือ 18.3) จะแสดงผลลัพธ์ดังต่อไปนี้

ป้อนคำอธิบายภาพที่นี่

การคลิกที่มันจะเปิดผลลัพธ์ทั้งหมดในวิวเวอร์ XML การเลื่อนไปทางขวาแสดงอักขระสุดท้ายของ B จะถูกเก็บรักษาไว้

อย่างไรก็ตามสิ่งนี้มีปัญหาสำคัญบางอย่าง การเพิ่มคอลัมน์พิเศษลงในแบบสอบถามจะทำให้เกิดผลและแถวพิเศษทั้งหมดจะเชื่อมต่อกับแถวแรก สุดท้ายหากสตริงมีอักขระเช่นการ<เปิดวิวเวอร์ XML ล้มเหลวโดยมีข้อผิดพลาดในการแยกวิเคราะห์

วิธีที่มีประสิทธิภาพมากขึ้นในการดำเนินการนี้เพื่อหลีกเลี่ยงปัญหาของ SQL Server ที่แปลง<เป็น&lt;ฯลฯ หรือล้มเหลวเนื่องจากอักขระเหล่านี้อยู่ด้านล่าง ( เครดิต Adam Machanic ที่นี่ )

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
การเพิ่ม CDATA ในคำสั่ง Convert ได้ผล! ขอบคุณมาก. :)
adamjford

การเพิ่มCDATAอาจใช้งานได้ แต่ถ้าข้อมูลของคุณมีอักขระควบคุมคุณต้องดำเนินการแทนที่ ในกรณีของฉันฉันใช้ตัวคั่นหน่วยรหัส ASCII 31 ภายในข้อมูลของฉัน เนื่องจากฉันใช้เพียงตัวละครตัวเดียวในหลาย ๆ ที่เท่านั้นจึงREPLACE(details, char(31), '&x1f;')พอเพียง หากฉันมีอักขระที่ไม่รู้จักหรือมีอักขระอื่นจำนวนมากที่จะแทนที่ฉันอาจต้องหาวิธีอื่น
Zarepheth

@ Zarepheth - CDATAสิ่งนี้เป็นคำแนะนำแรกของฉัน คนต่อมาAS [processing-instruction(x)]หลีกเลี่ยงสิ่งนั้น
Martin Smith

2
@MartinSmith คำตอบที่ยอดเยี่ยม! สงสัยว่าฉันเรียนรู้จากคำตอบของคุณมากแค่ไหน! +1
คินชาห์


28

วิธีแก้ปัญหาอย่างหนึ่งคือคลิกขวาที่ชุดผลลัพธ์แล้วเลือก "บันทึกผลลัพธ์เป็น ... " สิ่งนี้จะส่งออกเป็นไฟล์ CSV ที่มีเนื้อหาทั้งหมดของคอลัมน์ ไม่สมบูรณ์แบบ แต่ทำงานได้ดีพอสำหรับฉัน

วิธีแก้ปัญหา


11

คุณลองวิธีง่ายๆนี้หรือไม่? เพียง 2 คลิก!

ที่หน้าต่างแบบสอบถาม

  1. ตั้งค่าตัวเลือกการสืบค้นเป็น "Results to Grid" เรียกใช้แบบสอบถามของคุณ
  2. คลิกขวาที่แท็บผลลัพธ์ที่มุมตารางบันทึกผลลัพธ์เป็นไฟล์ใด ๆ

คุณจะได้รับข้อความทั้งหมดที่คุณต้องการเห็นในไฟล์ !!! ฉันเห็นอักขระ 130,556 ตัวสำหรับผลลัพธ์ของฟิลด์ varchar (MAX)

ผลลัพธ์ในไฟล์


1
ตรง - ง่าย - และลืมเสมอจนกว่าคุณจะต้องการอีกครั้ง :)
Dimi Takis

5

วิธีแก้ปัญหาที่ง่ายที่สุดที่ฉันพบคือการสำรองข้อมูลตารางและดูสคริปต์ เพื่อทำสิ่งนี้

  1. คลิกขวาที่ฐานข้อมูลของคุณแล้วเลือกTasks>Generate Scripts...
  2. คลิกหน้า "บทนำ" Next
  3. หน้า "เลือกวัตถุ"
    1. เลือกSelect specific database objectsและเลือกตารางของคุณ
    2. คลิก Next
  4. หน้า "ตั้งค่าตัวเลือกการเขียนสคริปต์"
    1. ตั้งค่าประเภทเอาต์พุตเป็น Save scripts to a specific location
    2. เลือกSave to fileและกรอกตัวเลือกที่เกี่ยวข้อง
    3. คลิก Advancedปุ่ม
    4. ตั้งค่าGeneral> Types of data to scriptเป็นData onlyหรือSchema and Dataแล้วคลิกตกลง
    5. คลิก Next
  5. "หน้าสรุป" คลิกถัดไป
  6. สคริปต์ sql ของคุณควรสร้างขึ้นตามตัวเลือกที่คุณตั้งไว้ใน 4.2 เปิดไฟล์นี้และดูข้อมูลของคุณ

3

ประเภทข้อมูล TEXT เก่าและไม่ควรใช้อีกต่อไปการเลือกข้อมูลจากคอลัมน์ TEXT เป็นเรื่องยาก

ntext ข้อความและรูปภาพ (Transact-SQL)

ประเภทข้อมูล ntext ข้อความและรูปภาพจะถูกลบออกใน Microsoft SQL Server เวอร์ชันอนาคต หลีกเลี่ยงการใช้ประเภทข้อมูลเหล่านี้ในงานพัฒนาใหม่และวางแผนที่จะแก้ไขแอปพลิเคชันที่ใช้อยู่ในปัจจุบัน ใช้ nvarchar (สูงสุด), varchar (สูงสุด) และ varbinary (สูงสุด) แทน

คุณต้องใช้TEXTPTR (Transact-SQL)เพื่อดึงข้อมูลข้อความ

ยังเห็นบทความนี้ในการจัดการข้อความชนิดข้อมูล


จะแปลงคอลัมน์เพื่อvarchar(MAX)ป้องกัน SSMS จากการตัดทอนข้อมูลออกหรือไม่
adamjford

ก่อนอื่นฉันจะใช้ SSMS เพื่อสร้าง scrip เพื่อแปลงคอลัมน์ TEXT ของคุณเป็น varchar (สูงสุด) จากนั้นคุณสามารถประเมินว่าคุณต้องการแปลงเป็นคอลัมน์ XML เพิ่มเติมหรือไม่ สำหรับขีด จำกัด การแสดง SSMS ผลลัพธ์เป็นกริดสามารถตั้งค่าให้แสดงข้อมูลที่ไม่ใช่ xml ได้สูงสุด 65,535 ตัวอักษรต่อคอลัมน์และไม่ จำกัด จำนวนข้อมูล xml (fyi คอลัมน์ตารางประเภท XML สามารถจัดเก็บได้เพียง 2 GB) แม้ว่าผลลัพธ์เป็นข้อความจะ จำกัด ไว้ที่ 8192 ตัวอักษรต่อคอลัมน์ ในการตั้งค่าขีด จำกัด สูงสุดเริ่มต้นเหล่านี้เพียงไปที่เมนูเครื่องมือ (ใน SSMS) จากนั้นตัวเลือก ... จากนั้นผลการค้นหาจากนั้นเซิร์ฟเวอร์ SQL จากนั้นจึงกำหนดผลลัพธ์เพื่อกริดหรือผลลัพธ์เป็นข้อความ
กม ธ .

3

ดูเหมือนว่า Xml อาจไม่ได้ถูกสร้างขึ้นมาอย่างดี หากเป็นเช่นนั้นคุณจะไม่สามารถแคสต์เป็น Xml ได้และเนื่องจากคุณมีข้อ จำกัด ในการส่งคืนข้อความใน Management Studio อย่างไรก็ตามคุณสามารถแยกข้อความออกเป็นชิ้นเล็ก ๆ ได้ดังนี้:

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

จากนั้นคุณจะต้องรวมเข้าด้วยตนเองอีกครั้ง

แก้ไข

ดูเหมือนว่ามีอักขระบางตัวในtextข้อมูลที่ตัวแยกวิเคราะห์ Xml ไม่ชอบ คุณสามารถลองแปลงค่าเหล่านั้นเป็นเอนทิตีแล้วลองใช้Convert(xml, data)เคล็ดลับ สิ่งที่ชอบ:

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

(ฉันต้องการแคสต์เป็น varchar (สูงสุด) เนื่องจากฟังก์ชันการแทนที่จะไม่ทำงานในtextคอลัมน์ไม่ควรมีเหตุผลใด ๆ ที่คุณไม่สามารถแปลงtextคอลัมน์เหล่านั้นเป็นvarchar(max))


โอ้ฉันคิดว่าฉันควรพูดถึงว่าคอลัมน์นั้นไม่ใช่ XML เลย การแปลงคอลัมน์เป็น XML เป็นเพียงวิธีแก้ปัญหาที่พบจาก Googling ซึ่งมีคนอื่นใช้เพื่อหลีกเลี่ยงขีด จำกัด SSMS จากการดึงข้อมูลจากคอลัมน์textหรือvarchar(MAX)คอลัมน์
adamjford

1
แก้ไขโค้ดของคุณด้านบนด้วย Tally As (เลือก ROW_NUMBER () OVER (ORDER BY s1.id) - 1 As Num From sys.sysobjects As s1 Cross Join sys.sysobjects As s2) เลือก Substring (T1.YourTextCol, T2.Num * 8000 + 1, 8000) จาก YourTable เป็น T1 Cross Join Tally As T2 โดยที่ T2.Num <= Ceiling (datalength (T1.YourTextCol) / 8000) Order By T2.Num
Ian Quigley

การใช้TSQLจาก @IanQuigley ตามคำตอบนี้ได้ผลดีสำหรับฉัน โดยพื้นฐานแล้วฉันเอาผลลัพธ์ (ลงเอยด้วยการบันทึก 11 รายการ) และวางไว้ด้วยกันใน Notepad ทำงานได้อย่างสมบูรณ์แบบ ต้องบันทึกสคริปต์นี้ ฉันมี XML ที่ยาวเป็นบ้าซึ่งมีอักขระที่ไม่ถูกต้อง
atconway

1

ฉันชอบการแฮ็ก XML แบบง่ายนี้ซึ่งทำให้คอลัมน์สามารถคลิกได้ใน SSMS แบบเซลล์ต่อเซลล์ ด้วยวิธีนี้คุณสามารถดูข้อมูลของคุณได้อย่างรวดเร็วในมุมมองแบบตารางของ SSMS และคลิกที่เซลล์ใดเซลล์หนึ่งเพื่อดูค่าทั้งหมดเมื่อมีความน่าสนใจ สิ่งนี้เหมือนกับเทคนิคของ OP ยกเว้นว่าจะหลีกเลี่ยงข้อผิดพลาดของ 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
;

โปรดทราบว่าตัวละครบางตัวไม่ถูกต้องในรูปแบบ XML 1.0 แต่ที่ถูกต้องใน/NVARCHAR VARCHARตัวอย่างเช่นอักขระ NUL (แตกต่างจากNULLค่าสำหรับฟิลด์) การแคสต์จะล้มเหลวสำหรับสตริงที่มีค่าฝังตัวดังกล่าว
binki

1

เริ่มตั้งแต่ SSMS 18.2 ตอนนี้คุณสามารถดูได้ถึง 2 ล้านอักขระในผลลัพธ์ตาราง ที่มา

อนุญาตให้แสดงข้อมูลเพิ่มเติม (ผลลัพธ์เป็นข้อความ) และเก็บไว้ในเซลล์ (ผลลัพธ์เป็นตาราง) ตอนนี้ SSMS อนุญาตให้ใช้อักขระได้สูงสุด 2 ล้านตัวสำหรับทั้งสอง

ฉันยืนยันสิ่งนี้ด้วยรหัสด้านล่าง

DECLARE @S varchar(max) = 'A'

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

SELECT @S as a

1
อักขระสูงสุดคือ2097152 ( ใน SSMS เวอร์ชัน 15.0.18333.0 )
stomy

0

ฉันคิดว่าคุณโชคไม่ดี ปัญหานี้ไม่ใช่ปัญหาระดับ SQL เนื่องจากคำตอบอื่น ๆ ทั้งหมดดูเหมือนจะมุ่งเน้น แต่เป็นเพียงหนึ่งในอินเทอร์เฟซผู้ใช้ Management Studio ไม่ได้หมายถึงอินเทอร์เฟซการเข้าถึงข้อมูลสำหรับวัตถุประสงค์ทั่วไป / ทั่วไป ไม่มีอินเทอร์เฟซของคุณ แต่เป็นพื้นที่การดูแลระบบของคุณและมีข้อ จำกัด ร้ายแรงในการจัดการข้อมูลไบนารีและข้อมูลการทดสอบขนาดใหญ่เนื่องจากผู้ที่ใช้อินเทอร์เฟซภายในโปรไฟล์การใช้งานที่ระบุจะไม่พบปัญหานี้

การนำเสนอข้อมูลข้อความขนาดใหญ่ไม่ใช่การใช้งานตามแผน

ทางเลือกเดียวของคุณคือฟังก์ชันที่มีมูลค่าตารางซึ่งรับการป้อนข้อความและตัดแถวสำหรับทุกบรรทัดเพื่อให้ Management Studio ได้รับรายการของแถวไม่ใช่แถวเดียว


ฉันรู้สึกว่าคำตอบนี้เดาได้ดีที่สุดหรือคุณมีแหล่งข้อมูลสำหรับ "การใช้งานตามแผน" หรือไม่ หากเป็น "สตูดิโอการจัดการ" SQL อย่างน้อยที่สุดก็ควรจะสามารถแสดงเนื้อหาของฐานข้อมูลของฉันได้ UI ที่แย่มาก
ตั้งแต่

คำตอบนี้ควรถูกลบเนื่องจากใช้ไม่ได้อีกต่อไป
Caius Jard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.