2012-05-24 4 views
6

मैं जावा आधारित ओएसएस ऐप SqlHawk पर काम कर रहा हूं, क्योंकि इसकी एक विशेषता सर्वर के विरुद्ध एसक्यूएल स्क्रिप्ट को अपग्रेड करना है।मैं Java/jtds एप्लिकेशन में SQL GO कथन का समर्थन कैसे कर सकता हूं?

माइक्रोसॉफ्ट ने GO कथन के साथ बैच में एक स्क्रिप्ट को विभाजित करने के लिए एक सम्मेलन बना दिया है, जो एक अच्छा विचार है, लेकिन केवल स्ट्रिंग पर झूठे मैचों के लिए पूछ रहा है।

फिलहाल मैं एक बहुत ही मौलिक है:

// split where GO on its own on a line 
Pattern batchSplitter = Pattern.compile("^GO", Pattern.MULTILINE); 
... 
String[] splitSql = batchSplitter.split(definition); 
... 

काम करता है किस तरह की लेकिन quoted GO statements या खरोज मुद्दों जैसी चीजों से ऊपर फिसल जा रहा है की संभावना है।

मुझे लगता है कि यह वास्तव में विश्वसनीय बनाने का एकमात्र तरीका ऐप में एक एसक्यूएल पार्सर होना है, लेकिन मुझे नहीं पता कि इस बारे में कैसे जाना है, या यह वास्तव में कम विश्वसनीय होने का अंत हो सकता है (विशेष रूप से यह टूल दिया गया है एकाधिक डीबीएमएस का समर्थन करता है)।

इस समस्या को हल करने के मैं किन तरीकों से हल कर सकता हूं? कोड उदाहरण यहां मेरे लिए बहुत उपयोगी होंगे।

Relevant sqlHawk code गीथब पर।

स्क्रिप्ट में पाए गए बैचों को निष्पादित करने के लिए वर्तमान में jtds का उपयोग कर रहा है।

+1

मैंने ऐसा ही किया जब मुझे ऐसा ही करना पड़ा। यह केवल आंतरिक रूप से उपयोग किया जाता है और हमारे लिए ठीक काम करता है। – brain

+1

यहां इडम ... यह मूर्ख-प्रमाण से बहुत दूर है और आपको यह तय करने की आवश्यकता है कि क्या आप 'जाओ 100' जैसी चीजों का समर्थन करना चाहते हैं। मुख्य बाधा आईएमएचओ तब होती है जब जीओ/* टिप्पणी ब्लॉक */का हिस्सा होता है। उनको अतिरिक्त प्रोसेसिंग की आवश्यकता होती है। (सभी टिप्पणियों और टिप्पणी ब्लॉक को पहले हटाएं, फिर विभाजन करें जो हमने किया) पीएस: आप कोड को 'सेट पेरिसोनली ऑन' के साथ उपसर्ग कर सकते हैं और यदि कोई 'गो के पास गलत वाक्यविन्यास' नहीं है तो विभाजन करने की कोई आवश्यकता नहीं है कोड .. अन्यथा आप त्रुटि से संकेतित लाइन-स्थान का उपयोग कर सकते हैं '' जाओ 'पर विभाजित करने के लिए इंगित करें ... काम कर सकता है, हालांकि आवश्यक से अधिक जटिल लगता है ... – deroby

+0

चीजों को जटिल करने के लिए उदाहरण: 'EXEC (' सेट पर ध्यान दें; चयन करें * t_entity से; जाओ; प्रिंट करें 0 ') ' – deroby

उत्तर

1

जाओ क्लाइंट बैच सेपरेटर कमांड है। आप इसे बदल सकते हैं; यह आपके EXEC गतिशील एसक्यूएल में नहीं भेजा जाना चाहिए।

USE master 
GO --<----- client actually send the first batch to SQL and wait for a response 
SELECT * from sys.databases 
GO 

Application.Exec("USE master"); 
Application.Exec("SELECT * from sys.databases"); 

में अनुवाद करना चाहिए सकता है या आप इसे इस तरह से लिख सकते हैं:

Application.Exec("'USE master;SELECT * from sys.databases") 

GO के बारे में अधिक http://msdn.microsoft.com/en-us/library/ms188037(v=sql.90).aspx

+0

धन्यवाद लेकिन यह मुझे कोई संकेत नहीं देता है कि मैं जावा में विभाजन को विश्वसनीय रूप से कैसे कर सकता हूं। मुझे लगता है कि आप EXEC के बारे में सही हैं लेकिन मैंने चेक नहीं किया है। –

1

ठीक है, तो यह नहीं जा रहा है बिल्कुल जो आप चाहते हैं, लेकिन आप माइग्र इसे एक शुरुआत मिल जाए। मैंने स्कीमाइंजिन (जो मेरे अधिकांश उत्पादों का मूल रूप बनाता है) को ओपन सोर्स here के रूप में जारी किया। वहां, आपको सी # कोड मिलेगा जो आप बहुत भरोसेमंद करना चाहते हैं (यानी तारों, टिप्पणियों इत्यादि के साथ आगे बढ़ना नहीं)। यह बैच x बार दोहराने के लिए 'जाओ एक्स' वाक्यविन्यास का भी समर्थन करता है।

आपको लगता है कि डाउनलोड करने और /Atlantis.SchemaEngine/Helpers में एक नजर है, तो आप एक वर्ग BatchParser.cs कहा जाता है जो एक विधि ParseBatches कहा जाता है मिल जाएगा - जो काफी क्या यह टिन पर कहते हैं करता है।

संबंधित मुद्दे