इस मामले में आप कॉलम को NOT NULL
के रूप में जोड़कर और मौजूदा पंक्तियों के मानों को as per my answer here में सेट करके समस्या से बच सकते हैं।
अधिक आम तौर पर समस्या एक पार्स/संकलन समस्या है। SQL सर्वर किसी भी कथन को निष्पादित करने से पहले बैच में सभी कथन संकलित करने का प्रयास करता है।
जब कोई कथन किसी तालिका का संदर्भ देता है जो सभी कथन में मौजूद नहीं है, तो स्थगित संकलन के अधीन है। जब तालिका पहले से मौजूद है तो यह एक त्रुटि फेंकता है यदि आप एक मौजूदा मौजूदा कॉलम का संदर्भ देते हैं। डीएमएल से अलग बैच में डीडीएल करना सबसे अच्छा तरीका है।
यदि कोई कथन दोनों मौजूदा तालिका में एक मौजूदा कॉलम का संदर्भ देता है और एक मौजूदा तालिका नहीं है तो संकलन स्थगित होने से पहले त्रुटि को फेंक दिया जा सकता है या नहीं।
आप अलग-अलग समूहों में यह करा सकता है, (उदाहरण के लिए ग्राहक उपकरण में बैच विभाजक GO
का उपयोग करके) या एक बच्चे गुंजाइश है कि EXEC
या EXEC sp_executesql
का उपयोग करके अलग से संकलित किया गया है में यह प्रदर्शन करते हैं।
पहला दृष्टिकोण आपको IF ...
के रूप में अपने कोड को दोबारा करने की आवश्यकता होगी क्योंकि बैच नहीं फैल सकता है।
IF NOT EXISTS(SELECT *
FROM sys.columns
WHERE Name = 'OPT_LOCK'
AND object_ID = Object_id('REP_DSGN_SEC_GRP_LNK'))
BEGIN
ALTER TABLE REP_DSGN_SEC_GRP_LNK
ADD OPT_LOCK NUMERIC(10, 0)
EXEC('UPDATE REP_DSGN_SEC_GRP_LNK SET OPT_LOCK = 0');
ALTER TABLE REP_DSGN_SEC_GRP_LNK
ALTER COLUMN OPT_LOCK NUMERIC(10, 0) NOT NULL
END;
स्रोत
2012-09-21 17:40:22
EXEC संपर्क मेरे लिए काम किया। धन्यवाद! – feradz
यह वह दृष्टिकोण है जिसे मैं वर्षों से उपयोग कर रहा हूं, और यह हमेशा मुझे आश्चर्यचकित करता है कि जब भी हम एक नया कॉलम जोड़ना चाहते हैं और इसे डेटा के साथ पॉप्युलेट करना चाहते हैं तो हमें यह अजीब गतिशील एसक्यूएल मार्ग लेने के लिए मजबूर होना पड़ता है ... –