2011-10-31 4 views
10

मैं एक बहुत ही सरल drop column बयान कोशिश कर रहा हूँ:क्या कॉलम को संदर्भित करने वाले आंकड़े उस स्तंभ को छोड़ने से रोकते हैं?

alter table MyTable drop column MyColumn 

और की

संदेश 5074, स्तर 16, राज्य 1, पंक्ति 1 पंक्तियों के साथ कई त्रुटियाँ प्राप्त
आँकड़े '_dta_stat_1268251623_3_2 'कॉलम' MyColumn 'पर निर्भर है।

संदेश 4922, स्तर 16, राज्य 9 से अंततः पीछा किया, पंक्ति 1
क्योंकि एक या अधिक ऑब्जेक्ट इस कॉलम का उपयोग ALTER तालिका ड्रॉप स्तंभ MyColumn विफल रहा है।

मुझे नहीं लगता था कि आंकड़े एक कॉलम को छोड़ने से रोकते हैं। क्या वे? यदि ऐसा है, क्योंकि ये स्पष्ट रूप से ऑटो-निर्मित आंकड़े हैं, इसलिए मैं एक ही डेटाबेस की कई प्रतियों में समान नामों पर निर्भर नहीं हो सकता, तो मैं एक अलग डेटाबेस पर निष्पादित करने के लिए अपग्रेड स्क्रिप्ट में ऐसे सभी आंकड़े कैसे छोड़ सकता हूं?

उत्तर

7

ऑटो-जेनरेट किए गए आंकड़े जिन्हें मैंने देखा है या तो वे इंडेक्स का नाम रखते हैं या WA_Sys_ जैसे कुछ के साथ शुरू करते हैं।

क्या आप 100% सुनिश्चित हैं कि यह सेट किए गए कस्टम आंकड़ों का एक सेट नहीं है?

चेक करें:

select * 
FROM sys.stats WHERE name = '_dta_stat_1268251623_3_2' 

... और देखते हैं कि user_created क्षेत्र इंगित करता है।

टिप्पणी प्रति:

यह untested है, लेकिन आप की तरह कुछ की कोशिश कर सकते:

exec sp_MSforeachdb ' 
use ? 

DECLARE @SQL varchar(max) = '''' 

select @SQL = @SQL + ''DROP STATISTICS '' + OBJECT_NAME(c.object_id) + ''.'' + s.name + CHAR(10) + CHAR(13) 
from sys.stats s 
INNER JOIN sys.stats_columns sc 
ON sc.stats_id = s.stats_id 
INNER JOIN sys.columns c 
ON c.column_id = sc.column_id 
WHERE c.name = ''ClaimNbr'' 
--and s.user_created = 1 

PRINT @SQL' 

बदलें एक EXEC अगर यह अच्छा लग रहा है के लिए PRINT

sp_msforeachdb पृष्ठभूमि में एक कर्सर लेकिन तर्क आप एक सेट के रूप कर सकते हैं के बाकी है।

+0

आप सही हैं! मेरा मानना ​​है कि ये डेटाबेस इंजन ट्यूनिंग सलाहकार द्वारा बनाए गए थे। क्या आप कॉलम का संदर्भ देने वाले सभी उपयोगकर्ता द्वारा निर्मित आंकड़ों को हटाने का तरीका सुझा सकते हैं? – Daniel

+0

आप उस जानकारी को प्राप्त करने/जुड़ने के लिए अन्य सिस्टम दृश्यों 'sys.stats_columns' और 'sys.columns' का उपयोग कर सकते हैं। – JNK

+0

हाँ, मैं उन्हें ड्रॉप करने Ye Olde कर्सर का सहारा चाहिए। धन्यवाद। – Daniel

12

जेएनके उत्तर में प्रस्तावित कोड काम नहीं करता है, लेकिन विचार अच्छा है। यदि आप सभी उपयोगकर्ता निर्मित आंकड़ों को हटाना चाहते हैं तो यह मेरा परीक्षण समाधान:

DECLARE @sql NVARCHAR(MAX) 

DECLARE statCursor CURSOR FOR 
SELECT 
    'DROP STATISTICS ' + QUOTENAME(SCHEMA_NAME(t.schema_id)) 
         + '.' + QUOTENAME(t.name) 
         + '.' + QUOTENAME(st.name) AS sql 
FROM 
    sys.stats AS st 
    INNER JOIN sys.tables AS t 
     ON st.object_id = t.object_id 
WHERE 
    st.user_created = 1 
ORDER BY 1; 

OPEN statCursor; 

FETCH NEXT FROM statCursor INTO @sql 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    PRINT @sql 
    EXEC sp_executesql @sql 
    FETCH NEXT FROM statCursor INTO @sql 
END 
CLOSE statCursor 
DEALLOCATE statCursor 
+0

आप वास्तव में सही हैं जेएनके उत्तर काम नहीं किया एसक्यूएल सर्वर 2008 (क्वेरी कभी समाप्त नहीं हुई) पर आपके उदाहरण को sys.columns – Harrison

+0

का उपयोग करने के लिए स्विच किया गया डेटाबेस द्वारा इसे प्रतिबंधित कैसे करें सभी डेटाबेस – MonsterMMORPG

+0

क्वेरी केवल वर्तमान डेटाबेस पर लागू होती है – psadac

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