SQLCMD कमांड एक्सेंट डालने में सक्षम नहीं है


19

मैं कमांड लाइन से एक नया डेटाबेस सेटअप करने के लिए sqlcmd.exe चलाने की कोशिश कर रहा हूं । मैं विंडोज 7 64 बिट्स पर SQL सर्वर एक्सप्रेस 2012 का उपयोग कर रहा हूं।

यहाँ मैं उपयोग की आज्ञा है:

SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log 

और यहाँ एक टुकड़ा sql फ़ाइल निर्माण स्क्रिप्ट है:

    CREATE DATABASE aqualogy 
    COLLATE Modern_Spanish_CI_AS
    WITH TRUSTWORTHY ON, DB_CHAINING ON;
    GO
    use aqualogy
    GO
    CREATE TABLE [dbo].[BaseLayers] (
    [Code] nchar(100) NOT NULL ,
    [Geometry] nvarchar(MAX) NOT NULL ,
    [IsActive] bit NOT NULL DEFAULT ((1)) 
    )

    EXEC sp_updateextendedproperty @name = N'MS_Description', @value = N'Capas de     cartografía base de la aplicaicón. Consideramos en Galia Móvil la cartografía(...)'
, @level0type = 'SCHEMA', @level0name = N'dbo'
, @level1type = 'TABLE', @level1name = N'BaseLayers'

खैर, कृपया जाँच लें कि शब्दों पर कुछ लहजे हैं; जो तालिका का विवरण है। डेटाबेस कोई समस्या नहीं के साथ बनाया गया है। 'Collate' को स्क्रिप्ट द्वारा समझा जाता है, जैसा कि आप संलग्न स्क्रीनशॉट में देख सकते हैं। इसके बावजूद, तालिका की जांच करते समय उच्चारण ठीक से नहीं दिखाए जाते हैं।टकराव की समस्या

मैं वास्तव में किसी भी मदद की सराहना करेंगे। आपका बहुत बहुत धन्यवाद।

[संपादित करें]: हाय सब। नोटपैड ++ का उपयोग करके SQL फ़ाइल एन्कोडिंग को बदलना ठीक काम किया! आपकी मदद के लिए बहुत-बहुत धन्यवाद: मैंने इस समस्या के साथ कुछ दिलचस्प सीखा!

यहाँ छवि विवरण दर्ज करें


1
आपकी SQL स्क्रिप्ट फ़ाइल की एन्कोडिंग क्या है?
पॉन्डलाइफ़

मैं @ पॉन्डलाइफ़ के विचार के साथ जाऊँगा। एक पाठ संपादक (जैसे नोटपैड ++) को पकड़ो, वहां .sql फ़ाइल खोलें, एन्कोडिंग पर जाएं और देखें कि आपकी फ़ाइल ANSI (या कुछ अन्य असमर्थित एन्कोडिंग) में नहीं है। यदि ऐसा है, तो फ़ाइल को किसी और चीज़ में बदलने के लिए चुनें। मैं कहूंगा कि UTF8 को यह करना चाहिए। आइए जानते हैं कि यह कैसे हुआ।
मैरियन

जवाबों:


8

टिप्पणियों से, समस्या तालिका या SQLCMD विशेष वर्णों को आयात करने के तरीके के साथ बिल्कुल नहीं है। आमतौर पर, समस्याग्रस्त आयात स्क्रिप्ट के प्रारूप से संबंधित होते हैं।

प्रबंधन स्टूडियो स्वयं एक विशिष्ट एन्कोडिंग के साथ बचत का विकल्प प्रदान करता है, जिसे भविष्य में समस्या का समाधान करना चाहिए। पहली बार किसी फ़ाइल को सहेजते समय (या इस रूप में सहेजें का उपयोग करें) आपको एन्कोडिंग के विकल्प को बचाने के लिए, सेव बटन के पास छोटे तीर पर क्लिक करना चाहिए ।

यहाँ छवि विवरण दर्ज करें

डिफ़ॉल्ट रूप से यह फ़ाइल को पश्चिमी यूरोपीय (1252) में सहेजता है । जब भी मेरे पास कोई विशेष वर्ण होता है, तो मैं यूटीएफ 8 का उपयोग करता हूं (हालांकि शायद कुछ अन्य प्रतिबंधात्मक एन्कोडिंग फिट होंगे) क्योंकि यह आमतौर पर सबसे तेज़ फिक्स है।

यहाँ छवि विवरण दर्ज करें

मुझे यकीन नहीं है (तस्वीर से) जो आप SSMS का उपयोग कर रहे हैं, इसलिए कृपया सुनिश्चित करें कि आपके अपने संपादक के पास फ़ाइल को अलग एन्कोडिंग में सहेजने का विकल्प है। यदि नहीं, तो फ़ाइल को स्मार्ट एडिटर में बदलना (जैसे आपने नोटपैड ++ में पहले ही कोशिश की है) आमतौर पर काम करता है। हालांकि यह काम नहीं कर सकता है यदि आप एक विस्तृत एन्कोडिंग से एक संकीर्ण में परिवर्तित कर रहे हैं और फिर एक विस्तृत एक (उदाहरण के लिए: यूनिकोड से एएनएसआई और यूनिकोड पर वापस)।


हाय मारियन। फिर से धन्यवाद। मैंने नविकट से 'डेटा ट्रांसफर' फीचर का इस्तेमाल किया, क्योंकि मुझे यह पसंद है कि यह एसक्यूएल स्क्रिप्ट (त्वरित, mdf-फ़ाइल स्वतंत्र, और अब से हमेशा मेरे लिए काम करता है) उत्पन्न करता है। मैंने नविकट पर 'डेटा ट्रांसफर' फीचर में कुछ मापदंडों की जाँच की, लेकिन मुझे आउटपुट फाइल एन्कोडिंग को बदलने का कोई तरीका नहीं मिला। एन्कोडिंग को बदलने के लिए मुझे नोटपैड ++ का उपयोग करके कुछ अतिरिक्त काम करना होगा, लेकिन यह कोई बड़ी बात नहीं है।
Oskytar

ठीक है, कोई समस्या नहीं। हालांकि, आमतौर पर, इस साइट पर धन्यवाद अपवोट फीचर (उत्तर के पास अप एरो) का उपयोग करके दिया जाता है, यदि उत्तर उपयोगी है, या, यदि यह आपकी समस्या को पूरी तरह से हल करता है, तो भी उत्तर के रूप में मार्क का उपयोग करना (उत्तर के पास चेकमार्क) ) :-) एफएक्यू में यहां और देखें ।
मैरियन

मैंने अपनी पिछली टिप्पणी को सही किया: आईटी डेटा को एनआईसीएटी के साथ 'डेटा ट्रांसफर' निष्पादित करते समय फ़ाइल आउटपुट एन्कोडिंग चुनना संभव है।
ओस्केटर

कूल, इसलिए अब आप मैन्युअल रूपांतरण चरण को बायपास कर पाएंगे। वह तो उससे भी बढ़िया है।
मैरियन

2
यह उत्तर सही नहीं लगता है। मेरे पास UTF-8 में नोटपैड ++ द्वारा सेव की गई फाइल थी। SQLCMD.exe वर्णों को सही तरीके से स्थानांतरित नहीं करता है। अगर मैं SSMS की सामग्री की प्रतिलिपि बनाता हूं, तो यह ठीक काम करता है। असली समाधान था परम-एफ 65001 को जोड़ने के लिए स्वैसेक द्वारा प्रदान किया गया उत्तर।
टॉमस

39

एक अन्य विकल्प, जिनमें मैं सिर्फ सीखा है, से आता है प्रलेखन । फ़ाइल एन्कोडिंग से मेल खाने के लिए आपको कोडपेज सेट करना होगा । UTF-8 के मामले में, कोड पृष्ठ 65001 है ताकि आप चाहें:sqlcmdsqlcmd

SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log -f 65001


1
इसने मेरे जीवन को बचा लिया, मैं CSV फ़ाइल को पढ़ने के लिए एक पॉवरशेल स्क्रिप्ट करने वाला था, जिसमें आयात-सीएसवी-कोडिंग UTF8 गो यह सही है। धन्यवाद
Spörri

यह मेरे लिए तब काम आया जब मुझे आयरिश पाठ मानों को फड़स (á, é, í, ú, ú) के साथ एक NVARCHAR कॉलम में
दोपहर

यह सही उत्तर है
पिचमैट

2

इस तरह की बात बहुत पेचीदा है क्योंकि इतना कुछ आपको बताए बिना किया जाता है।

पहली बात मैं स्ट्रिंग प्रदर्शित करने के लिए sqlcmd का उपयोग करूँगा। यदि यह cmd.exe विंडो में सही ढंग से प्रदर्शित होता है, तो यह एक उपयोगी तथ्य है। आगे, मैं पंक्ति को चुनकर convertस्ट्रिंग को varbinary में देखूंगा कि वास्तव में बाइट्स क्या हैं। मुझे लगता है कि कार्टोग्राफिया के रूप में दिखाई देगा 0x636172746f67726166c3ad61, जहां उच्चारण "i" को बाइट्स c3ad द्वारा दर्शाया गया है, जो उस चरित्र के लिए UTF-8 एन्कोडिंग है। आधुनिक स्पेनिश कॉलम (विंडोज 1252) में UTF-8 का होना अच्छा नहीं है। उस वर्ण के लिए Windows 1252 में बाइट मान 237 दशमलव (हेक्स ED) है।

यदि स्तंभ गलत डेटा रखता है, तो यह त्रुटि है कि इसे कैसे डाला गया था। शायद स्ट्रिंग एन स्थिरांक में अग्रणी एन को हटाने - N'string'यूनिकोड स्ट्रिंग उत्पन्न करने के लिए एसक्यूएल सर्वर को बताता है, लेकिन सादे 'string'इंगित करता है कि चरित्र क्लाइंट के एन्कोडिंग का उपयोग करते हैं - यूनिकोड के बजाय आधुनिक स्पेनिश सम्मिलित करेंगे।

यदि कॉलम सही ढंग से एन्कोडेड डेटा रखता है, तो मैं कहूंगा कि आपको GUI डिस्प्ले में एक बग मिला।

यदि आप डेटा को सही तरीके से डालने के लिए sqlcmd नहीं प्राप्त कर सकते हैं (अग्रणी N या नहीं), तो आप Microsoft से शिकायत करना चाहते हैं। जब आप करते हैं, तो कॉलम में संग्रहीत बाइट्स को दिखाने में सक्षम होना - उपयोग करना convert(colname as varbinary)- यह समझाने के लिए महत्वपूर्ण होगा कि क्या गलत हो रहा है।


हाय जेम्स, आपके विस्तृत जवाब के लिए बहुत-बहुत धन्यवाद। मैंने कुछ परीक्षण किए, और Sqlcmd.exe सही स्ट्रिंग नहीं दिखा रहा है। यह स्पष्ट रूप से एक समस्या है कि डेटा कैसे डाला जाता है।
Oskytar

Sql Profiler का उपयोग करते हुए, मैंने SQl सर्वर GUI क्लाइंट का उपयोग करते समय SQL सर्वर को कौन से वाक्य भेजे थे, इस पर बहस की। INSERT INTO [ElementType] ([Code], [Name], [Description], [GeometryType], [stringId], [CapturedGeometryType]) VALUES ('ESTACION', 'Estacón', 'Estación', 'Multipoint', NULL) 'बिंदु'); ठीक काम किया है, इसलिए सभी लहजे ठीक से डाला गया था !. यह वही 'इन्सर्ट वाक्य' है जो मेरी एसक्यूएल स्क्रिप्ट में दिखाई देता है। क्या मुझे sql स्क्रिप्ट फ़ाइल में वर्ण कोड निर्दिष्ट करना चाहिए?
Oskytar
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.