2010-06-09 17 views
5

में एक ही संग्रहीत प्रक्रिया में एक कॉलम जोड़ें और इसे अद्यतन अगर मैं एक संग्रहीत प्रक्रिया है कहनाएसक्यूएल सर्वर 2008

CREATE PROCURE w AS 

ALTER TABLE t ADD x char(1) 

UPDATE t set x =1 

यहां तक ​​कि जब यह मेरे कि संग्रहीत प्रक्रिया बनाने के (अगर मैं इसे बनाने के एक्स मौजूद न होने पर) की सुविधा देता है, जब यह चलता है, तो अद्यतन विवरण पर कोई त्रुटि होती है क्योंकि कॉलम x मौजूद नहीं है।

इससे निपटने का पारंपरिक तरीका क्या है, यह हर समय आना चाहिए? मैं EXEC के अंदर अद्यतन डालकर इसके आसपास काम कर सकता हूं, क्या कोई और बेहतर तरीका है?

धन्यवाद

+3

पृथ्वी पर क्यों आप स्प्रोक में तालिका स्कीमा को संशोधित कर रहे हैं? –

+0

quelle horreur हुह? यह एक निर्णय कॉल है, शायद एक बुरा है। जिस तालिका में मैं बदलाव कर रहा हूं वह वह है जिसमें कच्चा डेटा अपलोड किया जाता है। और अलग-अलग शमाओं के साथ अलग-अलग टेबल होंगे। सभी मामलों में, उन्हें इन दो कॉलमों की आवश्यकता होगी जो स्रोत में नहीं हैं। कॉलम "वास्तविक कर आईडी" हैं और "टैक्सिड प्रोग्रामेटिक रूप से एक है"। तो एस प्रो में कदम रखने के लिए मनुष्यों को एसआर का उपयोग करके संचार करने का एक और तरीका है कि "यह कोई वापसी का मुद्दा नहीं है, अगर आपको वैध नहीं मिला तो आपको टैक्सिड नंबर बनाना होगा" । – TortTupper

उत्तर

2

के बजाय इस तरह एक स्तंभ जोड़ने और फिर अपने मूल्य को अद्यतन करने के लिए, आप संदर्भ में एक डिफ़ॉल्ट मान

CREATE PROCEDURE w AS 

ALTER TABLE t ADD x char(1) NOT NULL CONSTRAINT abc DEFAULT 1 
+0

सुरुचिपूर्ण समाधान! लेकिन काम करेगा, मुझे लगता है, केवल तभी नया कॉलम NULL – abatishchev

+0

धन्यवाद की अनुमति नहीं देता है, लेकिन 1 वास्तव में वह मूल्य नहीं है जो मैं चाहता हूं, मैं "कॉलम" खंड से किसी मान को नया कॉलम अपडेट करना चाहता हूं; मेरे पास एक उदाहरण के रूप में मेरे उदाहरण में 1 था जो कुछ सरल दिखाने के लिए त्रुटि उत्पन्न करता था। – TortTupper

+0

पहले वैरिएबल में मान प्राप्त करें और यहां उपयोग करने के बजाय @@ variable = 1 ALTER टेबल टी जोड़ें x char (1) नल कंसस्ट्रेंट एबीसी DEFAULT @@ वैरिएबल आपके लिए काम कर सकता है –

3

1 लेन-देन के संदर्भ में ALTER TABLE और UPDATE के साथ एक स्तंभ जोड़ सकते हैं 2:

CREATE PROCEDURE w 
AS 
    BEGIN TRAN 
     ALTER TABLE .. 
    COMMIT 

    BEGIN TRAN 
     UPDATE .. 
    COMMIT 
END 
+0

सक्रिय लगता है लेकिन मैं इसे काम नहीं कर सकता : बनाएं प्रक्रिया पी के रूप में TRAN शुरू ALTER तालिका टी जोड़ें एक्स CHAR (1) COMMIT शुरू TRAN अद्यतन टी सेट x = 1 COMMIT यदि मैं "ईएनडी" का उपयोग करता हूं तो मुझे सिंटैक्स त्रुटि मिलती है। यदि मैं इसे सफलतापूर्वक प्रक्रिया बना देता हूं, तो मुझे अभी भी एक ही त्रुटि मिलती है यदि "x" रन टाइम पर मौजूद नहीं है (और यदि यह अस्तित्व में था तो एक और त्रुटि मिलेगी) – TortTupper

+0

@TortTupper: ऐसा लगता है कि यह SQL सर्वर की एक सीमा है। MS.Connect पर एक बग फ़ाइल कैसे करें? मैं इसे ऊपर उठाऊंगा। मेरा कामकाज: 2 अलग-अलग एसपी बनाएं और उन्हें बारी-बारी से कॉल करें। या एक तीसरा बनाएं जो 1 और 2 – abatishchev

+0

@TortTupper को कॉल करेगा: एक और विचार ऐसा क्यों होता है। एसक्यूएल सर्वर सपा निर्माण के दौरान एक गैर-अभी तक मौजूद कॉलम तक पहुंचने वाला एसपी नहीं बना सकता है। तो हो सकता है कि आपका काम अभी तक असंभव है .. ( – abatishchev

-1

मुझे लगता है कि आपको बनाने के बाद ही एक गो स्टेटमेंट जोड़ना चाहिए।

एसक्यूएल सर्वर ऐसा भेज देगा, और फिर आपका अपडेट ठीक काम करेगा।

0

जो समस्या आप चल रहे हैं वह यह है कि आपकी प्रक्रिया के लिए निर्माण को निष्पादित करने से पहले आपके अपडेट को मौजूदा तालिका के विरुद्ध सत्यापित किया जा रहा है।

यदि आप इस सब के लिए प्रतिबद्ध हैं तो आपको यह सुनिश्चित करना होगा कि जब आप प्रक्रिया को बनाते/बदलते हैं तो तालिका मौजूद नहीं होती है, जो गैर-अस्तित्व के कारण स्थगित नाम समाधान पथ को पार्सर ले जाती है वस्तुओं।

प्रक्रिया के निर्माण के बाद, आप अपनी तालिका बना सकते हैं।

मुझे लगता है कि आपकी प्रक्रिया पहले से ही टेबल को बूंद/बनाता है या आपको वास्तव में इस तरह की प्रक्रिया की आवश्यकता नहीं होगी।

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