2012-09-06 8 views
7

मेरे पास एक डेटाबेस है जिसमें मेरे पास बहुत कम प्रकार के कॉलम हैं। अन्य कॉलम जोड़ने के बाद मुझे सभी पुराने कॉलमों को डिफ़ॉल्ट "गलत" मान रखने की आवश्यकता है।MSSQL में सभी डेटाबेस में सभी बिट प्रकार कॉलम नल मानों को गलत में कैसे बदलें?

उत्तर

18

0 करने के लिए प्रत्येक वर्ष स्तंभ अपडेट करने के लिए इस क्वेरी (एक कॉलम-दर-स्तंभ के आधार पर) का उपयोग कर सकते हैं: फिर,

UPDATE MyTable 
SET OldCol1 = 0 
WHERE OldCol1 IS NULL 

यदि आप के रूप में 0 से डिफ़ॉल्ट के लिए भविष्य के किसी भी मान चाहते हैं अच्छा, इसका उपयोग करें:

ALTER TABLE MyTable 
ALTER COLUMN OldCol1 bit NOT NULL 

ALTER TABLE MyTable 
ADD CONSTRAINT OldCol1ShouldBeFalse DEFAULT 0 FOR OldCol1 

अब, आपको प्रत्येक पुराने कॉलम के खिलाफ इसे चलाने की ज़रूरत होगी, इसलिए उम्मीद है कि आपके पास बहुत अधिक नहीं हैं।

3

यह नेस्टेड गतिशील एसक्यूएल नौकरी प्राप्त करेगा यदि आप इसे एक-एक करके नहीं करना चाहते हैं। ध्यान दें कि यह सत्यापित करने के लिए पहले कोई जांच नहीं करता है कि कॉलम में पहले से ही एक डिफ़ॉल्ट बाधा नहीं है (जो संभव है, भले ही कॉलम निरर्थक हो), लेकिन स्क्रिप्ट को ऐसा करने के लिए बढ़ाया जा सकता है (और यहां तक ​​कि ड्रॉप भी यदि यह डिफ़ॉल्ट है तो ऐसी बाधा 1)।

DECLARE @sql NVARCHAR(MAX); 
SET @sql = N'DECLARE @sql NVARCHAR(MAX); SET @sql = N'''';'; 

SELECT @sql = @sql + N' 
    SELECT @sql = @sql + N''UPDATE ' + QUOTENAME(name) 
    + '.'' + QUOTENAME(s.name) + ''.'' + QUOTENAME(t.name) + '' 
    SET '' + QUOTENAME(c.name) + '' = 0 
    WHERE '' + QUOTENAME(c.name) + '' IS NULL; 

    ALTER TABLE ' + QUOTENAME(name) + '.'' + QUOTENAME(s.name) 
    + ''.'' + QUOTENAME(t.name) 
    + '' ADD CONSTRAINT '' + c.name + ''_FalseByDefault 
    DEFAULT (0) FOR '' + QUOTENAME(c.name) + ''; 

    ALTER TABLE ' + QUOTENAME(name) + '.'' + QUOTENAME(s.name) 
    + ''.'' + QUOTENAME(t.name) 
    + '' ALTER COLUMN '' + QUOTENAME(c.name) + '' BIT NOT NULL; 
    '' 

FROM ' + QUOTENAME(name) + '.sys.columns AS c 
INNER JOIN ' + QUOTENAME(name) + '.sys.tables AS t 
ON c.[object_id] = t.[object_id] 
INNER JOIN ' + QUOTENAME(name) + '.sys.schemas AS s 
ON t.[schema_id] = s.[schema_id] 
WHERE c.system_type_id = 104 AND c.is_nullable = 1 
AND t.is_ms_shipped = 0;' 
FROM sys.databases WHERE database_id > 4; 

SET @sql = @sql + 'PRINT @sql; 
    --EXEC sp_executesql @sql;'; 

EXEC sp_executesql @sql; 

यह को देखने के लिए वास्तव में बदसूरत है, और PRINT आदेश जरूरी प्रबंधन स्टूडियो में उत्पादन सीमाओं के कारण पूरा नहीं होगा। लेकिन एक बार जब आप आश्वस्त हो जाते हैं कि पहले कुछ कमांड सही दिखते हैं, तो आप टिप्पणी कर सकते हैं और दूसरी अंतिम पंक्ति को असम्बद्ध कर सकते हैं और परिवर्तन करने के लिए स्क्रिप्ट को फिर से चला सकते हैं। जाओ वहाँ है क्योंकि कुछ असफल हो सकते हैं। आप प्रत्येक डीबी/टेबल/कॉलम संयोजन के लिए प्रिंट आउटपुट जोड़ना चाह सकते हैं ताकि आप वास्तविक डीबी/टेबल/कॉलम के साथ किसी भी संभावित त्रुटियों को अधिक आसानी से सहसंबंधित करने के लिए स्थिति संदेशों को प्रिंट कर सकें।

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