तालिका संशोधित करें: नल को अनुमति देने के लिए शून्य से विशेषता 'अनुमति दें नल' को कैसे बदलें


207

नल की अनुमति के लिए तालिका में एक विशेषता को कैसे बदलना है? आल्टर टेबल शायद?


12
SQL सर्वर प्रबंधन स्टूडियो ऐसे सरल कार्य के लिए एक बहुत ही जटिल स्क्रिप्ट बनाता है। इसलिए मैं भ्रमित हो गया और स्टैकओवरफ़्लो की जाँच की। हो सकता है कि यह सवाल का बिंदु है ...
टिलिटो

जवाबों:


363
-- replace NVARCHAR(42) with the actual type of your column
ALTER TABLE your_table
ALTER COLUMN your_column NVARCHAR(42) NULL

4
या जैसा ALTER TABLE your_table ALTER COLUMN your_column NVARCHAR(42)कि यह स्पष्ट रूप से अन्यथा निर्दिष्ट नहीं होने पर वैसे भी नल की अनुमति देने के लिए डिफ़ॉल्ट होगा।
मार्टिन स्मिथ

3
ध्यान दें कि यदि नल को अनुमति देने के लिए कई कॉलम बदलने की आवश्यकता है, तो आपको अलग-अलग ALTER TABLE .. ALTER COLUMN ..कमांड करने की आवश्यकता होगी
sonyisda1

2
देखते हैं - नोट कुछ मामलों में जहां इस शक्ति काम नहीं देखते हैं इस डीबीए स्टैक एक्सचेंज जवाब अगर आप एक हो रही हैALTER TABLE ALTER COLUMN failed because one or more objects access this column.
जारोड डिक्सन

49

हाँ आप ALTER TABLEनिम्नानुसार उपयोग कर सकते हैं :

ALTER TABLE [table name] ALTER COLUMN [column name] [data type] NULL

ALTER TABLEप्रलेखन से उद्धरण :

NULLप्राथमिक कुंजी बाधाओं में स्तंभों को छोड़कर, शून्य मानों की अनुमति देने के लिए ALTER COLUMNएक NOT NULLस्तंभ को बाध्य करने के लिए निर्दिष्ट किया जा सकता है ।


22

अन्य तालिका सही है:

ALTER TABLE MyCustomers ALTER COLUMN CompanyName VARCHAR(20) NULL

2
क्या आप सुनिश्चित हैं कि आपको बाधाओं और फिर डेटा प्रकार को फिर से परिभाषित करने की आवश्यकता है? MSDN आलेख में यह उल्लेख नहीं किया गया है कि बाधाओं को नए सिरे से परिभाषित करने की आवश्यकता होगी: "अगर NULL या NOT NULL को ALTER COLUMN के साथ निर्दिष्ट किया गया है, तो new_data_type [(परिशुद्धता [, स्केल])] को भी निर्दिष्ट किया जाना चाहिए। यदि डेटा प्रकार, सटीक और। स्केल नहीं बदले गए हैं, वर्तमान कॉलम मान निर्दिष्ट करें। "
डैनियल वेसलो

@ डैनियल वासल्लो - आप सही कह रहे हैं। मैं पूरा होने की कोशिश कर रहा था, लेकिन NULL / NOT NULL को बदलना एकमात्र परिवर्तन होना चाहिए।
Oded


4
ALTER TABLE public.contract_termination_requests
ALTER COLUMN management_company_id DROP NOT NULL;

2
@ NotronLÁrincz सवाल हालांकि पोस्टग्रैज के बारे में नहीं है। इसे SQL सर्वर टैग किया गया है, इसलिए यह उत्तर गलत है।
मार्टिन स्मिथ

आप सही हैं, लेकिन फिर भी इसने मेरी मदद की और मुझे लगता है कि यह उन लोगों के लिए एक उपयोगी टिप्पणी है, जो Google के माध्यम से सवाल खोजते हैं। प्रश्न का शीर्षक यह स्पष्ट नहीं करता है कि यह किस डेटाबेस सर्वर के बारे में है।
एरॉन लोरिंज़

1

मैंने यह लिखा था इसलिए मैं एक ही बार में सभी टेबल और कॉलम को नल करने के लिए संपादित कर सकता था:

select 
case
when sc.max_length = '-1' and st.name in ('char','decimal','nvarchar','varchar')
then
'alter table  [' + so.name + '] alter column [' + sc.name + '] ' + st.name + '(MAX) NULL'
when st.name in ('char','decimal','nvarchar','varchar')
then
'alter table  [' + so.name + '] alter column [' + sc.name + '] ' + st.name + '(' + cast(sc.max_length as varchar(4)) + ') NULL'
else
'alter table  [' + so.name + '] alter column [' + sc.name + '] ' + st.name + ' NULL'
end as query
from sys.columns sc
inner join sys.types st on st.system_type_id = sc.system_type_id
inner join sys.objects so on so.object_id = sc.object_id
where so.type = 'U'
and st.name <> 'timestamp'
order by st.name

1

ऐसा करने के लिए यह दृष्टिकोण है: -

  1. जांचें कि तालिका या स्तंभ मौजूद है या नहीं।
  2. यदि हाँ, तो कॉलम बदलें। जैसे: -
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE 
            TABLE_CATALOG = 'DBName' AND 
            TABLE_SCHEMA = 'SchemaName' AND
            TABLE_NAME = 'TableName' AND
            COLUMN_NAME = 'ColumnName')
BEGIN
    ALTER TABLE DBName.SchemaName.TableName ALTER COLUMN ColumnName [data type] NULL
END  

यदि आपके पास कोई स्कीमा नहीं है तो स्कीमा लाइन को हटा दें क्योंकि आपको डिफ़ॉल्ट स्कीमा देने की आवश्यकता नहीं है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.