मैं मानों की एक सरणी के साथ एक तालिका को अपडेट करने की कोशिश कर रहा हूं। सरणी के प्रत्येक आइटम में SQL सर्वर डेटाबेस में एक तालिका में एक पंक्ति से मेल खाती जानकारी होती है। यदि पंक्ति पहले से ही तालिका में मौजूद है, तो हम उस पंक्ति को दिए गए सरणी में जानकारी के साथ अद्यतन करते हैं। और, हम तालिका में एक नई पंक्ति सम्मिलित करते हैं। मैंने मूल रूप से मुखर वर्णन किया है।
अब, मैं इसे एक एक्सएमएल पैरामीटर लेने वाली संग्रहीत प्रक्रिया में प्राप्त करने का प्रयास कर रहा हूं। कारण मैं XML का उपयोग कर रहा हूं और तालिका-मूल्यवान नहीं है, क्योंकि बाद में, मुझे SQL में कस्टम प्रकार बनाना होगा और इस प्रकार को संग्रहीत कार्यविधि के साथ जोड़ना होगा। अगर मैंने कभी अपनी संग्रहीत प्रक्रिया या सड़क के नीचे मेरे db स्कीमा में कुछ बदला है, तो मुझे संग्रहीत प्रक्रिया और कस्टम प्रकार दोनों को फिर से करना होगा। मैं इस स्थिति से बचना चाहता हूं। इसके अलावा, टीवीपी की एक्सएमएल पर जो श्रेष्ठता है वह मेरी स्थिति के लिए उपयोगी नहीं है क्योंकि, मेरे डेटा सरणी का आकार कभी भी 1000 से अधिक नहीं होगा। इसका मतलब है कि मैं यहां प्रस्तावित समाधान का उपयोग नहीं कर सकता: SQL सर्वर 2008 में XML का उपयोग करके कई रिकॉर्ड कैसे सम्मिलित करें
साथ ही, यहां एक समान चर्चा ( UPSERT - क्या MERGE या @@ rowcount? का बेहतर विकल्प है? ) मैं जो पूछ रहा हूं, उससे अलग है, क्योंकि मैं एक मेज पर कई पंक्तियों को उखाड़ने की कोशिश कर रहा हूं ।
मुझे उम्मीद थी कि मैं xml से मानों को बनाए रखने के लिए प्रश्नों के निम्नलिखित सेट का उपयोग करूंगा। लेकिन इससे काम नहीं चलने वाला है। यह दृष्टिकोण केवल तब काम करना है जब इनपुट एकल पंक्ति हो।
begin tran
update table with (serializable) set select * from xml_param
where key = @key
if @@rowcount = 0
begin
insert table (key, ...) values (@key,..)
end
commit tran
अगला विकल्प निकास IF EXTSTS या निम्न में से किसी एक रूप का उपयोग करना है। लेकिन, मैं इसे उप-इष्टतम दक्षता के होने के आधार पर अस्वीकार करता हूं:
IF (SELECT COUNT ... ) > 0
UPDATE
ELSE
INSERT
अगला विकल्प मर्ज विवरण का उपयोग कर रहा था जैसा कि यहां वर्णित है: http://www.databasejournal.com/features/mssql/use-the-merge-statement-to-perform-an-upsert.html । लेकिन, फिर मैंने यहां मर्ज क्वेरी के साथ मुद्दों के बारे में पढ़ा: http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/ । इस कारण मैं मर्ज से बचने की कोशिश कर रहा हूं।
तो, अब मेरा सवाल है: SQL Server 2008 में संग्रहीत कार्यविधि में XML पैरामीटर का उपयोग करके किसी भी अन्य विकल्प को प्राप्त करने के लिए कोई अन्य विकल्प या बेहतर तरीका है?
कृपया ध्यान दें कि XML पैरामीटर में डेटा में कुछ रिकॉर्ड हो सकते हैं जो वर्तमान रिकॉर्ड से पुराने होने के कारण UPSERTed नहीं होने चाहिए। ModifiedDate
XML और गंतव्य तालिका दोनों में एक फ़ील्ड है जिसकी तुलना यह निर्धारित करने के लिए की जानी चाहिए कि रिकॉर्ड अपडेट किया जाए या छोड़ दिया जाए।
MERGE
बर्ट्रेंड के मुद्दों के साथ ज्यादातर किनारे के मामले और अक्षमताएं हैं, स्टॉपर्स नहीं दिखाते हैं - यदि यह एक वास्तविक मेरा क्षेत्र था तो एमएस ने इसे जारी नहीं किया होगा। क्या आप सुनिश्चित हैं कि जिन परिवृत्तियों से आप बच MERGE
रहे हैं, वे बचत करने की तुलना में अधिक संभावित त्रुटि पैदा नहीं कर रहे हैं?
MERGE
। MERGE के INSERT और UPDATE चरणों को अभी भी अलग से संसाधित किया जाता है। मेरे दृष्टिकोण में मुख्य अंतर तालिका चर है जो अद्यतन रिकॉर्ड आईडी और DELETE क्वेरी रखता है जो आने वाले डेटा के अस्थायी तालिका से उन रिकॉर्ड को निकालने के लिए उस तालिका चर का उपयोग करता है। और मुझे लगता है कि टेम्परेचर टेबल पर डंप करने के बजाय @ XMLRam.nodes () से प्रत्यक्ष हो सकता है, लेकिन फिर भी, उन अतिरिक्त मामलों में से किसी एक में खुद को खोजने के बारे में चिंता करने की ज़रूरत नहीं है। )।