मैं SQL Server 2008 प्रबंधन स्टूडियो में किसी पाठ या varchar (MAX) कॉलम की पूरी सामग्री कैसे देख सकता हूँ?


94

इस लाइव SQL सर्वर 2008 (10.0.1600 का निर्माण) डेटाबेस में, एक Eventsतालिका होती है, जिसमें एक textकॉलम होता है जिसका नाम है Details। (हां, मुझे एहसास है कि यह वास्तव में एक varchar(MAX)स्तंभ होना चाहिए , लेकिन जिसने भी इस डेटाबेस को स्थापित किया है उसने ऐसा नहीं किया।)

इस स्तंभ में अपवादों और संबद्ध JSON डेटा के बहुत बड़े लॉग हैं, जो मैं SQL सर्वर प्रबंधन स्टूडियो के माध्यम से एक्सेस करने का प्रयास कर रहा हूं, लेकिन जब भी मैं ग्रिड से परिणाम को एक पाठ संपादक में कॉपी करता हूं, तो यह 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)मेरे संकटों को ठीक करने के लिए कॉलम को बदलना होगा?

जवाबों:


97

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 व्यूअर को खोलने से पार्सिंग एरर फेल हो जाता है।

एसक्यूएल सर्वर में परिवर्तित करने का मुद्दों से बचा जाता है कि ऐसा करने का एक और अधिक मजबूत तरीका <करने के लिए &lt;इन पात्रों के कारण आदि या असफल रहने के नीचे (है क्रेडिट एडम 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 को जोड़ने का काम किया! बहुत बहुत धन्यवाद। :)
एडमजफोर्ड

जोड़ने से CDATAकाम चल सकता है, लेकिन यदि आपके डेटा में नियंत्रण वर्ण शामिल हैं, तो आपको एक प्रतिस्थापित ऑपरेशन करना होगा। मेरे मामले में, मैं अपने डेटा के भीतर यूनिट सेपरेटर, ASCII कोड 31 का उपयोग कर रहा था। चूँकि मैं केवल एक ही पात्र का कई स्थानों पर उपयोग कर रहा था, एक साधारण REPLACE(details, char(31), '&x1f;')पर्याप्त। यदि मेरे पास अज्ञात वर्ण या प्रतिस्थापित करने के लिए बड़ी संख्या में विभिन्न वर्ण हैं, तो मुझे एक और समाधान खोजना पड़ सकता है।
ज़रीफेथ

@Zarepheth - CDATAबात मेरा पहला सुझाव था। बाद में AS [processing-instruction(x)]बचा जाता है कि।
मार्टिन स्मिथ

1
@MartinSmith उत्कृष्ट उत्तर! आश्चर्य है कि मैं आपके उत्तरों से कितना सीखता हूं! +1
परिजन शाह


25

एक काम के आसपास परिणाम सेट पर राइट-क्लिक करना है और "परिणाम इस रूप में सहेजें ..." चुनें। यह स्तंभ की संपूर्ण सामग्री के साथ इसे CSV फ़ाइल में निर्यात करता है। सही नहीं है, लेकिन मेरे लिए काफी अच्छा काम किया है।

वैकल्पिक हल


10

क्या आपने इस सरल समाधान की कोशिश की? केवल 2 क्लिक दूर!

क्वेरी विंडो पर,

  1. "परिणाम के लिए ग्रिड" के लिए क्वेरी विकल्प सेट करें, अपनी क्वेरी चलाएँ
  2. ग्रिड कॉर्नर पर परिणाम टैब पर राइट क्लिक करें, परिणाम को किसी भी फाइल के रूप में सहेजें

आपको वो सभी टेक्स्ट मिलेंगे जो आप फाइल में देखना चाहते हैं !!! मैं अपने varchar (MAX) फ़ील्ड के परिणाम के लिए 130,556 वर्ण देख सकता हूँ

एक फ़ाइल में परिणाम


1
सीधे - आसान - और हमेशा तब तक भूल जाते हैं जब तक आपको फिर से इसकी आवश्यकता न हो :)
डिमी तकिस

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 कॉलम से डेटा का चयन करने के लिए एक दर्द है।

पाठ, पाठ और छवि (लेनदेन-एसक्यूएल)

Microsoft SQL सर्वर के भविष्य के संस्करण में ntext, पाठ और छवि डेटा प्रकार हटा दिए जाएंगे। नए विकास कार्यों में इन डेटा प्रकारों का उपयोग करने से बचें, और उन अनुप्रयोगों को संशोधित करने की योजना बनाएं जो वर्तमान में उनका उपयोग करते हैं। इसके बजाय nvarchar (अधिकतम), varchar (अधिकतम), और varbinary (अधिकतम) का उपयोग करें।

पाठ डेटा को पुनः प्राप्त करने के लिए आपको TEXTPTR (Transact-SQL) का उपयोग करने की आवश्यकता है ।

इस लेख को टेक्स्ट डेटा प्रकार को संभालने पर भी देखें ।


क्या varchar(MAX)SSMS को डेटा को ट्रंक करने से रोकने के लिए कॉलम को परिवर्तित करेगा ?
adamjford

मैं सबसे पहले SSMS का उपयोग आपके TEXT कॉलम को varchar (max) में परिवर्तित करने के लिए स्प्रेड जेनरेट करने के लिए करूंगा। यदि आप इसे किसी XML स्तंभ में परिवर्तित करना चाहते हैं, तो आप वहां से मूल्यांकन कर सकते हैं। SSMS प्रदर्शन सीमा के अनुसार, ग्रिड पर परिणाम प्रति स्तंभ गैर xml डेटा के 65,535 वर्णों को प्रदर्शित करने के लिए सेट किया जा सकता है, और असीमित मात्रा में xml डेटा (fyi, XML प्रकार के टेबल कॉलम केवल 2 जीबी स्टोर कर सकते हैं)। जबकि पाठ का परिणाम प्रति कॉलम 8192 वर्णों तक सीमित है। इन डिफ़ॉल्ट अधिकतम सीमाओं को सेट करने के लिए, बस (SSMS में) टूल मेनू पर जाएं, फिर विकल्प ... फिर QUERY परिणाम, फिर SQL सर्वर, फिर परिणाम को GRID या परिणाम के लिए पाठ करें।
के.एम.

3

ऐसा लगता है कि Xml अच्छी तरह से नहीं बन सकता है। यदि ऐसा है, तो आप इसे एक्सएमएल के रूप में नहीं डाल पाएंगे और यह देखते हुए, आप प्रबंधन स्टूडियो में कितने पाठ वापस कर सकते हैं, इसमें सीमित हैं। हालाँकि, आप पाठ को छोटे टुकड़ों में तोड़ सकते हैं जैसे:

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 में परिवर्तित करना केवल एक कामचलाऊ तरीका है जिसे मैंने Googling से पाया है कि किसी अन्य व्यक्ति ने SSMS की सीमा textया varchar(MAX)स्तंभ से डेटा प्राप्त करने की सीमा के आसपास उपयोग किया है ।
एडमजफोर्ड

1
ऊपर दिए गए अपने कोड का EDIT; Tally As (Select ROW_NUMBER () OVER (ORDER BY s1.id) के साथ - 1 sys से sys.sysobjects के रूप में ss पार करें। * *००० + १, From,०००) योरटेबल से टी १ क्रॉस के रूप में टैली के रूप में टी २ में शामिल हों जहां टी २.एनम <= सीलिंग (डटलैट्रिक्स (T1.YourTextCol) / Order०००) टी २ के द्वारा ऑर्डर करें
Quigley

का उपयोग करते हुए TSQLइस उत्तर के आधार पर @IanQuigley से मेरे लिए अच्छी तरह से काम किया। मैंने मूल रूप से नतीजे निकाले (11 रिकॉर्ड समाप्त किए गए) और बस उन्हें नोटपैड में एक साथ चिपकाया। पूरी तरह से काम किया। इस लिपि को बचाने की जरूरत है। मेरे पास कुछ पागल लंबे एक्सएमएल थे जिनमें अमान्य वर्ण शामिल थे।
16

1

मैं इस सरल XML हैक को पसंद करता हूं जो सेल-बाय-सेल आधार पर SSMS में कॉलम को क्लिक करने योग्य बनाता है। इस पद्धति से, आप SSMS के सारणीबद्ध दृश्य में अपना डेटा जल्दी से देख सकते हैं और दिलचस्प होने पर पूर्ण मान देखने के लिए विशेष कक्षों पर क्लिक करते हैं। यह ओपी की तकनीक के समान है सिवाय इसके कि यह एक्सएमएल त्रुटियों से बचा जाता है।

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। उदाहरण के लिए, एनयूएल चरित्र ( NULLक्षेत्र के लिए मूल्य से अलग )। ऐसे अंतर्निहित मूल्यों के साथ तार के लिए कलाकार विफल हो जाएगा।
बिंकी

1

SSMS 18.2 से शुरू होकर, अब आप ग्रिड परिणामों में अधिकतम 2 मिलियन वर्ण देख सकते हैं। स्रोत

अधिक डेटा प्रदर्शित करने की अनुमति दें (परिणाम का पाठ) और कोशिकाओं में संग्रहीत (परिणाम के लिए ग्रिड)। SSMS अब दोनों के लिए 2M वर्ण तक की अनुमति देता है।

मैंने इसे नीचे दिए गए कोड से सत्यापित किया।

DECLARE @S varchar(max) = 'A'

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

SELECT @S as a

1
अधिकतम वर्ण वास्तव में 2097152 ( SSMS संस्करण 15.0.18333.0 में ) है।
पेट

0

आप भाग्य से बाहर हैं, मुझे लगता है। यह समस्या SQL स्तर की समस्या नहीं है क्योंकि अन्य सभी उत्तर पर ध्यान दिया जाता है, लेकिन उपयोगकर्ता इंटरफ़ेस में से एक है। प्रबंधन स्टूडियो एक सामान्य उद्देश्य / सामान्य डेटा एक्सेस इंटरफ़ेस नहीं है। यह आपका इंटरफ़ेस नहीं है, लेकिन आपका प्रशासनिक क्षेत्र है, और इसमें बाइनरी डेटा और बड़े परीक्षण डेटा को संभालने की गंभीर सीमाएं हैं - क्योंकि निर्दिष्ट उपयोग प्रोफ़ाइल के भीतर इसका उपयोग करने वाले लोग इस समस्या में नहीं चलेंगे।

बड़े पाठ डेटा को प्रस्तुत करना नियोजित उपयोग नहीं है।

आपकी एकमात्र पसंद एक टेबल वैल्यू फ़ंक्शन होगी जो टेक्स्ट इनपुट को लेती है और इसे प्रत्येक पंक्ति के लिए पंक्तियों में कटौती करती है, जिससे प्रबंधन स्टूडियो को एक पंक्ति नहीं, बल्कि पंक्तियों की एक सूची मिलती है।


मुझे लगता है कि यह उत्तर सबसे अच्छा अनुमान है, या क्या आपके पास "नियोजित उपयोग" के लिए कोई स्रोत है? यदि यह एक एसक्यूएल "प्रबंधन स्टूडियो" है, तो मुझे अपने डेटाबेस की सामग्री को दिखाने में सक्षम होना चाहिए। बिल्कुल भयानक यूआई।
बांध

यह उत्तर हटा दिया जाना चाहिए क्योंकि यह अब लागू नहीं है
कायुस जार्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.