एक तालिका में एक स्तंभ जोड़ें, अगर यह पहले से मौजूद नहीं है


188

मैं एमएस SQL ​​सर्वर के लिए एक क्वेरी लिखना चाहता हूं जो एक तालिका में एक कॉलम जोड़ता है। जब मैं निम्नलिखित क्वेरी को चलाता / निष्पादित करता हूं, तो मुझे कोई त्रुटि प्रदर्शन नहीं चाहिए।

मैं तालिका जोड़ने के लिए इस प्रकार का उपयोग कर रहा हूं ...

IF EXISTS (
       SELECT *
       FROM   sys.objects
       WHERE  OBJECT_ID = OBJECT_ID(N'[dbo].[Person]')
              AND TYPE IN (N'U')
   )

लेकिन मुझे नहीं पता कि इस क्वेरी को किसी कॉलम के लिए कैसे लिखा जाए।



आप का उपयोग करना चाहिए sys.tables"सामान्य" के बजाय sys.objects- तो आप स्पष्ट रूप से प्रकार निर्दिष्ट करने की जरूरत नहीं है (यह से स्पष्ट है sys.tablesपहले से ही ....)
marc_s

COL_LENGTH वैकल्पिक केवल SQL-Server 2008 से काम करता है, लेकिन यह काम करता है।
पॉल-हेनरी

जवाबों:


218

आप sys.columnsतालिका io का उपयोग करके एक समान निर्माण का उपयोग कर सकते हैं sys.objects

IF NOT EXISTS (
  SELECT * 
  FROM   sys.columns 
  WHERE  object_id = OBJECT_ID(N'[dbo].[Person]') 
         AND name = 'ColumnName'
)

42
ध्यान दें कि इस उदाहरण में आप IF कोड का उपयोग अपने वास्तविक कोड में नहीं करना चाहते हैं।
नेट

2
अनुकूलित क्वेरी के लिए आप शीर्ष 1 का चयन स्टेटमेंट के साथ कर सकते हैं
बैंकटेश्वर नारायण

11
@BanketeshvarNarayan यह गलत है। एक EXISTSखंड में उपश्रेणियों के लिए निष्पादन योजनाएं समान हैं। जैसी चीजें SELECT 1या SELECT TOP 1अनावश्यक हैं। EXISTSखंड ही क्वेरी अनुकूलक बताता केवल प्रदर्शन करने के लिए न्यूनतम आवश्यक पढ़ता मूल्यांकन करने के लिए EXISTS... कम से कम एसक्यूएल सर्वर में। अन्य DB इंजन में अधिक या कम कुशल क्वेरी अनुकूलक हो सकता है।
केनेथ कोचरन

9
@BanketeshvarNarayan यदि आप अपने ADD Columnप्रश्नों का अनुकूलन कर रहे हैं ... तो आप उन्हें अक्सर चला रहे होंगे!
फेंटन

1
@ user391339 - मैंने एक समान निर्माण पोस्ट किया है जैसे कि ओपी ने पोस्ट किया है लेकिन हां, यदि आप कार्रवाई करना चाहते हैं यदि कॉलम मौजूद नहीं है, तो स्टेटमेंट IF IF EXISTS नहीं होगा। मुझे वास्तव में इसके लिए उत्तर को संपादित करने की आवश्यकता महसूस नहीं होती है, लेकिन अगर आपको लगता है कि यह एक सुधार है, तो अपने आप को संपादित करने के लिए स्वतंत्र महसूस करें।
लेवेन कीर्सेमेकर्स

91
IF COL_LENGTH('table_name', 'column_name') IS NULL
BEGIN
    ALTER TABLE table_name
    ADD [column_name] INT
END

1
मैंने ऐसा करने की कोशिश की, लेकिन यह एक त्रुटि देता है जो बताता है कि COL_LENGTH फ़ंक्शन मौजूद नहीं है।
ThEpRoGrAmMiNgNoOb

3
SQL सर्वर 2008+
रॉबर्ट ब्राउन

6
छोटे जोड़ - किसी को स्तंभ नाम में चौकोर कोष्ठक का उपयोग नहीं करना चाहिए, क्योंकि COL_LENGTH('table_name', '[column_name]')SQL सर्वर 2016 में हमेशा वापस लौटता है ( COL_LENGTH('[table_name]', 'column_name') works as expected)।
स्टॉप-क्रेन

33

एक और विकल्प। मैं इस दृष्टिकोण को पसंद करता हूं क्योंकि यह कम लेखन है लेकिन दोनों एक ही बात को पूरा करते हैं।

IF COLUMNPROPERTY(OBJECT_ID('dbo.Person'), 'ColumnName', 'ColumnId') IS NULL
BEGIN
    ALTER TABLE Person 
    ADD ColumnName VARCHAR(MAX) NOT NULL
END

मैंने यह भी देखा कि आपकी तलाश है कि टेबल कहाँ मौजूद है जो स्पष्ट रूप से बस यही है

 if COLUMNPROPERTY( OBJECT_ID('dbo.Person'),'ColumnName','ColumnId') is not null

2
मुझें यह पसंद है। मुझे लगता है कि यहां पोस्ट करने के बारे में सबसे अच्छा हिस्सा इस तरह के रत्न पा रहा है।
JStead

2
Col ColumnId ’क्या है?
मारियस स्टैनेसक्यू

'ColumnId' उस कॉलम प्रॉपर्टी का नाम है जिसे आप चेक कर रहे हैं। आप शायद किसी संपत्ति के नाम का उपयोग कर सकते हैं जो किसी स्तंभ पर मौजूद है, जैसे कि नाम, आदि
जैक्स बॉश

5

यहाँ एक और भिन्नता है जो मेरे लिए काम करती है।

IF NOT EXISTS (SELECT 1
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE upper(TABLE_NAME) = 'TABLENAME'
        AND upper(COLUMN_NAME) = 'COLUMNNAME')
BEGIN
    ALTER TABLE [dbo].[Person] ADD Column
END
GO

संपादित करें: ध्यान दें कि INFORMATION_SCHEMAदृश्य हमेशा अपडेट नहीं किए जा सकते, SYS.COLUMNSइसके बजाय उपयोग करें :

IF NOT EXISTS (SELECT 1 FROM SYS.COLUMNS....


0
IF NOT EXISTS (SELECT * FROM syscolumns
  WHERE ID=OBJECT_ID('[db].[Employee]') AND NAME='EmpName')
  ALTER TABLE [db].[Employee]
  ADD [EmpName] VARCHAR(10)
GO

मुझे उम्मीद है कि इससे मदद मिलेगी। और जानकारी


इसने मेरे लिए SqlServer 2000 पर काम किया जबकि स्वीकृत उत्तर नहीं था। Sys। Sverlerver 2005 के आसपास कहीं और जोड़े गए हैं। docs.microsoft.com/en-us/sql/relational-dat डेटाबेस/…
ZeRemz

0

किसी अन्य डेटाबेस में एक कॉलम की जाँच करते समय, आप बस डेटाबेस का नाम शामिल कर सकते हैं:

IF NOT EXISTS (
  SELECT * 
  FROM   DatabaseName.sys.columns 
  WHERE  object_id = OBJECT_ID(N'[DatabaseName].[dbo].[TableName]') 
         AND name = 'ColumnName'
)

-1
IF NOT EXISTS (SELECT 1  FROM SYS.COLUMNS WHERE  
OBJECT_ID = OBJECT_ID(N'[dbo].[Person]') AND name = 'DateOfBirth')
BEGIN
ALTER TABLE [dbo].[Person] ADD DateOfBirth DATETIME
END
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.