लंबे तार को तोड़ने के लिए SQL सर्वर / T-SQL समर्थन लाइन-निरंतरता करता है?


13

मेरे पास कभी-कभी एक एसक्यूएल स्क्रिप्ट होती है जिसमें एक या एक से अधिक सुपर-लॉन्ग (कभी-कभी बेवकूफ-लंबे) तार भी होते हैं। आमतौर पर ये VARBINARYशाब्दिक / स्थिरांक होते हैं जो फाइलों / असेंबली का प्रतिनिधित्व करते हैं, लेकिन कभी-कभी ये पाठ होते हैं।

वास्तव में लंबे तार के साथ प्राथमिक समस्या यह है कि कुछ पाठ संपादक उन सभी को अच्छी तरह से संभाल नहीं पाते हैं। उदाहरण के लिए, मेरे पास एक VARBINARYशाब्दिक है जो मैं एक CREATE ASSEMBLY [AssemblyName] FROM 0x....बयान में उपयोग करता हूं , और विधानसभा खुद आकार में केवल 1 एमबी से अधिक है, जो पाठ फ़ाइल में सिर्फ 2 मिलियन से अधिक वर्णों के बराबर है क्योंकि प्रत्येक बाइट को हेक्स नोटेशन में दो वर्णों का प्रतिनिधित्व करने की आवश्यकता होती है (जैसे 0x1F= ए 1और ए F)। SQL सर्वर प्रबंधन स्टूडियो (SSMS) इसे अच्छी तरह से हैंडल नहीं करता है और कई सेकंड तक लटका रहता है क्योंकि मैं उस लाइन पर स्क्रॉल करने का प्रयास करता हूं। और वास्तव में, कुछ संस्करणों (निश्चित रूप से अगर यह अभी भी होता है) भी एक स्क्रिप्ट को खोलते समय लंबी लाइनों के बारे में एक चेतावनी प्रदर्शित करेगा जिसमें एक निश्चित लंबाई पर कम से कम एक रेखा होती है।

एक द्वितीयक मुद्दा यह है कि यह उस स्वरूपण को जटिल करता है जब या तो वर्ड-रैप सक्षम किए बिना संपादक में उपयोग किया जाता है, या ऑनलाइन पोस्ट किया जाता है। यहाँ समस्या यह है कि क्षैतिज स्क्रॉल बार के लिए स्लाइडर बहुत संकीर्ण है और इसे थोड़ा-सा हिलाने पर भी आमतौर पर गैर-सुपर-लॉन्ग टेक्स्ट को देखने के लिए स्क्रॉल करता है।

अब, टी-एसक्यूएल नई लाइनों या अर्ध-कॉलनों के साथ आदेशों को समाप्त नहीं करता है (हालांकि सेमी-कॉलन्स को प्राथमिकता दी जाती है / अनुशंसित होती है, SQL सर्वर 2005 के साथ शुरू होती है)। इसलिए चूंकि SQL सर्वर प्रत्येक कथन को पार्स करना जानता है, जैसे कि यह जानता है कि यह कब समाप्त होता है, ऐसा लगता है कि कई लाइनों में लंबी लाइन को विभाजित करना, केवल newline/ carriage-return+ द्वारा अलग किया गया है line-feed, अनुचित नहीं लगता है। लेकिन यह किसी भी मामले में काम नहीं करता है।

PRINT 'Line1
Line2';

रिटर्न ("संदेश" टैब में):

Line1
Line2

और यह काफी समझ में आता है क्योंकि न्यूलाइन शाब्दिक / स्थिर है। लेकिन यह VARBINARYभी एक के लिए काम नहीं करता है।

PRINT 0x1234
5678;

मुझे एक त्रुटि देता है।

जवाबों:


13

शुक्र है कि \( एसक्यूएल ) चरित्र के माध्यम से टी-एसक्यूएल में लाइन-निरंतरता के लिए समर्थन है । बस एक पंक्ति के अंत में newline/ carriage-return+ से ठीक पहले line-feedऔर नई लाइन को नजरअंदाज कर दिया जाएगा।

टेक्स्ट स्ट्रिंग्स के लिए, यह निम्नानुसार व्यवहार करता है:

PRINT 'Line1\
Line2';

रिटर्न ("संदेश" टैब में):

Line1Line2

बाइनरी / हेक्स स्ट्रिंग्स के लिए, यह निम्नानुसार व्यवहार करता है:

PRINT 0x1234\
5678;

रिटर्न ("संदेश" टैब में):

0x12345678;

बाइनरी फ़ाइलों (असेंबली, सर्टिफिकेट) को एसक्यूएल स्क्रिप्ट में उपयोग के लिए टेक्स्ट हेक्स-बाइट स्ट्रिंग्स में प्रारूपित करने के लिए, मैंने बाइनरीफ़ॉर्मेटर नामक एक कमांड-लाइन उपयोगिता लिखी है जिसे मैंने गीथहब पर ओपन-सोर्स के रूप में जारी किया है। यह न केवल द्विआधारी फ़ाइल को एक पाठ प्रतिनिधित्व में परिवर्तित करता है, बल्कि VARBINARYप्रत्येक पंक्ति के उपयोग के लिए वर्ण की निर्दिष्ट संख्या के आधार पर, लंबी पंक्तियों को फैलाने के लिए लाइन-निरंतरता का भी उपयोग करता है । परिणाम कुछ इस प्रकार है:

4D5A09DE34F178313345A4\
00007F4E39782EFC48D842\
00000000

फिर मैं अपनी स्क्रिप्ट में कॉपी और पेस्ट करता हूं, जैसा कि {...}नीचे के क्षेत्र में दिखाया गया है :

CREATE ASSEMBLY [AssemblyName]
FROM 0x\
{output from BinaryFormatter}
;

इस विषय पर अतिरिक्त जानकारी के लिए, कृपया मेरा ब्लॉग पोस्ट देखें: टी-एसक्यूएल में लाइन-कंटीन्यूएशन

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