2012-09-21 19 views
19

क्या कोई यह देखता है कि SQL सर्वर के लिए इस कोड के साथ क्या गलत है?कॉलम के बाद एसक्यूएल सर्वर अपडेट पर अमान्य कॉलम नाम

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) 

     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; 

जब मैं इस चलाने के लिए, मैं:

संदेश 207, स्तर 16, राज्य 1, पंक्ति 3
अमान्य स्तंभ नाम 'OPT_LOCK'।

अद्यतन कमांड पर।

धन्यवाद।

उत्तर

33

इस मामले में आप कॉलम को 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; 
+1

EXEC संपर्क मेरे लिए काम किया। धन्यवाद! – feradz

+0

यह वह दृष्टिकोण है जिसे मैं वर्षों से उपयोग कर रहा हूं, और यह हमेशा मुझे आश्चर्यचकित करता है कि जब भी हम एक नया कॉलम जोड़ना चाहते हैं और इसे डेटा के साथ पॉप्युलेट करना चाहते हैं तो हमें यह अजीब गतिशील एसक्यूएल मार्ग लेने के लिए मजबूर होना पड़ता है ... –

0

आपकी जानकारी के लिए, आप COL_LENGTH समारोह के साथ IF NOT EXISTS बदल सकते हैं। यह दो पैरामीटर,

  1. तालिका नाम और

  2. कॉलम आप के लिए

खोज रहे हैं लेता कॉलम तो मिलता है, तो यह स्तंभ पूर्व की डेटाप्रकार की सीमा देता है: Int (4 बाइट्स), जब नहीं मिला तो यह NULL देता है।

तो, आप इसे निम्नानुसार उपयोग कर सकते हैं और 3 स्टेटमेंट्स को एक साथ जोड़ सकते हैं।

IF (SELECT COL_LENGTH('REP_DSGN_SEC_GRP_LNK','OPT_LOCK')) IS NULL 

BEGIN 

    ALTER TABLE REP_DSGN_SEC_GRP_LNK 
    ADD OPT_LOCK NUMERIC(10, 0) NOT NULL DEFAULT 0 

END; 

इसे आसान बनाता है।