अन्य स्टेटमेंट में मल्टी स्टेटमेंट ट्रांजेक्शन की अनुमति नहीं है


13

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

अन्य स्टेटमेंट में मल्टी स्टेटमेंट ट्रांजेक्शन की अनुमति नहीं है

त्रुटि पंक्ति 9 को इंगित करती है, जो है:

IF NOT EXISTS (SELECT * FROM sys.data_spaces WHERE type='FX')
    ALTER DATABASE CURRENT ADD FILEGROUP [AdventureWorks2012_mod] 
    CONTAINS MEMORY_OPTIMIZED_DATA
GO

चूंकि यह (अधिक या कम) आधिकारिक Microsoft दस्तावेज़ीकरण है, मैं मान रहा हूं कि यह कुछ ऐसा है जो मैं गलत कर रहा हूं, लेकिन मैं यह पता नहीं लगा सकता कि यह क्या है।

जवाबों:


13

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

आज स्क्रिप्ट को फिर से अधिक बारीकी से देखते हुए, स्पष्ट रूप से परिभाषित कोई लेनदेन हैंडलिंग नहीं है, लेकिन शायद आपने स्क्रिप्ट को एक क्वेरी विंडो में चिपकाया है जिसमें पहले से ही एक सक्रिय लेनदेन था, या एक नई क्वेरी विंडो बनाई जो स्वचालित रूप से BEGIN TRANSACTION; / COMMIT TRANSACTION;बयान जोड़ देती है।

मैंने इस ब्लॉग पोस्ट में कुछ अन्य संभावित गोचरों के बारे में भी बताया ।


1
"शायद आपने स्क्रिप्ट को एक क्वेरी विंडो में चिपकाया है जिसमें पहले से ही एक सक्रिय लेनदेन था" ऐसा लगता है कि समस्या थी, क्योंकि जब मैंने पूरी क्वेरी को एक नई विंडो में चलाया, तो यह काम किया।
पेट्र ब्रोडिन

9

मैं @AaronBertrand से सहमत हूँ कि आप कुछ भी गलत नहीं कर रहे हैं। यह पहली बार नहीं होगा जब मैंने इसमें बग के साथ Microsoft स्क्रिप्ट देखी हो। वास्तविक रूप से कई लिपियों के रूप में वे प्रकाशित करते हैं मुझे आश्चर्य है कि कोई भी नहीं देखेगा।

विशेष रूप से समस्या यह है कि ALTER DATABASEलेनदेन में अनुमति नहीं है। आप यहां BOL संदर्भ देख सकते हैं: लेन-देन में अनुमत लेनदेन-SQL कथन

वास्तव में भी सरल एक स्क्रिप्ट के रूप में यह एक ही त्रुटि के साथ विफल रहता है।

BEGIN TRANSACTION
ALTER DATABASE AdventureWorks2012 SET READ_WRITE
COMMIT

जैसा कि हारून ने कहा, लेन-देन की हैंडलिंग (या लेनदेन से कम से कम ALTER DATABASEविवरण) को हटा दें और आपको ठीक होना चाहिए।


-2

लेनदेन को अलग करने के लिए "गो" का उपयोग करें। वह समस्या को हल करेगा। (इसका एक-एक करके चलाना आसान है।) अलगाव स्तर भी बदल सकता है (परीक्षण नहीं किया गया)

SET TRANSACTION ISOLATION LEVEL SERIALISABLE

Begin tran

---Statements goes here

commit tran

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

आप पोस्ट करने से पहले अपने कोड का परीक्षण करना चाह सकते हैं जब अन्य लोगों ने पहले ही पहचान लिया है कि ALTER DATABASEलेनदेन के भीतर प्रदर्शन नहीं किया जा सकता है। आइसोलेशन स्तर सेट करने SERIALIZABLEसे इस पर कोई प्रभाव नहीं पड़ता है।
मैक्स वर्नोन

"GO" एक SQL कथन नहीं है। यह SSMS को एक बैच के रूप में एसक्यूएल सर्वर के लिए पूर्ववर्ती विवरण प्रस्तुत करने के लिए एक निर्देश है। यदि आप बहादुर महसूस कर रहे हैं तो आप इसे बदल सकते हैं: उपकरण -> विकल्प -> क्वेरी निष्पादन -> SQL सर्वर। एक ही लेनदेन के भीतर कई बैच जमा किए जा सकते हैं।
माइकल ग्रीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.