2013-01-31 11 views
5

कॉलम जो खाली/शून्य/स्थान या शून्य के रूप में छोड़े गए हैं (तालिकाओं की एक सूची दी गई है)।किसी डेटाबेस (SQL सर्वर 2008) में अप्रयुक्त कॉलम का पता कैसे लगाएं।

मान लीजिए कि मैं केंद्रीय सिस्टम टेबल से तालिका और कॉलम परिभाषाओं को खींच सकता हूं, मुझे उपर्युक्त स्थिति को कैसे देखना चाहिए?

उत्तर

9

इस दृढ़ संकल्प के लिए SQL सर्वर के अंदर कोई विशेष प्रक्रिया नहीं है। आपको प्रत्येक तालिका से पूछताछ करने की आवश्यकता है। यहाँ एक जानवर बल समाधान है:

ऊपर समाधान में
If object_id('tempdb..#Results') is not null 
    Drop Table #Results; 
GO 
Create Table #Results 
    (
    TableSchema sysname not null 
    , TableName sysname not null 
    , ColumnName sysname not null 
    ); 
GO 

Declare @TableSchema sysname; 
Declare @TableName sysname; 
Declare @ColumnName sysname; 
Declare @DataType sysname; 
Declare @Columns Cursor; 
Declare @BaseSql nvarchar(max); 
Declare @Sql nvarchar(max); 
Declare @AdditionalFilter nvarchar(max); 

Set @BaseSql = 'Insert #Results(TableSchema, TableName, ColumnName) 
       Select ''TABLE_SCHEMA'', ''TABLE_NAME'', ''COLUMN_NAME'' 
       From (Select 1 As V) As Z 
       Where Not Exists (
            Select 1 
            From [TABLE_SCHEMA].[TABLE_NAME] 
            Where [COLUMN_NAME] Is Not Null 
             ADDITIONAL_FILTER 
            )'; 

Set @Columns = Cursor Fast_Forward For 
    Select C.TABLE_SCHEMA, C.TABLE_NAME, C.COLUMN_NAME, C.DATA_TYPE 
    From INFORMATION_SCHEMA.COLUMNS As C 
     Left Join INFORMATION_SCHEMA.VIEWS As V 
      On V.TABLE_SCHEMA = C.TABLE_SCHEMA 
       And V.TABLE_NAME = C.TABLE_NAME 
    Where V.TABLE_NAME Is Null; 

Open @Columns; 
Fetch Next From @Columns Into @TableSchema, @TableName, @ColumnName, @DataType; 

While @@Fetch_Status = 0 
Begin 
    If @DataType In('int','smallint','tinyint','bigint','numeric','bit','decimal','money','smallmoney','float','real') 
     Set @AdditionalFilter = 'And [COLUMN_NAME] <> 0'; 
    Else If @DataType In('char','nchar','varchar','nvarchar','text','ntext') 
     Set @AdditionalFilter = 'And Len([COLUMN_NAME]) > 0'; 
    Else 
     Set @AdditionalFilter = ''; 

    Set @Sql = Replace(@BaseSql, 'ADDITIONAL_FILTER', @AdditionalFilter); 
    Set @Sql = Replace(@Sql, 'TABLE_SCHEMA', @TableSchema); 
    Set @Sql = Replace(@Sql, 'TABLE_NAME', @TableName); 
    Set @Sql = Replace(@Sql, 'COLUMN_NAME', @ColumnName); 

    --Print @Sql 
    Exec(@Sql) 
    Fetch Next From @Columns Into @TableSchema, @TableName, @ColumnName, @DataType; 
End 

Close @Columns; 
Deallocate @Columns; 

Select * 
From #Results 

एक मोड़ है कि एक मेज से किसी भी स्तंभ है कि खाली है लौटा दी जाएगी है। आप टेबल कि खाली हैं बाहर करने के लिए करना चाहता था, तो आप केवल निम्नलिखित करने के लिए क्वेरी को समायोजित करने की जरूरत:

Set @BaseSql = 'Insert #Results(TableSchema, TableName, ColumnName) 
       Select ''TABLE_SCHEMA'', ''TABLE_NAME'', ''COLUMN_NAME'' 
       From (Select 1 As V) As Z 
       Where Exists (
           Select 1 
           From [TABLE_SCHEMA].[TABLE_NAME] 
           ) 
       And Not Exists (
           Select 1 
           From [TABLE_SCHEMA].[TABLE_NAME] 
           Where [COLUMN_NAME] Is Not Null 
            ADDITIONAL_FILTER 
           )'; 
+0

डेटाबेस ट्यूनिंग के लिए बहुत उपयोगी (: एस मैं एक बहुत अप्रयुक्त स्तंभों मैं कम हो जाना चाहिए है)। मैंने अभी अंतिम चयन तक डेटा प्रकार और ऑर्डर जोड़ा है। धन्यवाद! – Roimer

+0

"उपरोक्त कोड चलाते समय" लेन डेटा के तर्क 1 के लिए तर्क डेटा प्रकार टेक्स्ट अमान्य है "होता है। क्या इसके बजाय ** DATALENGTH ** का उपयोग करना बेहतर होगा? –

+0

@adolfgarlic - आप 'डेटालेथेंथ' फ़ंक्शन का भी उपयोग कर सकते हैं। मुझे संदेह है कि लेन फ़ंक्शन 'टेक्स्ट' और' ntext' डेटाटाइप पर बारफिंग हो सकता है। – Thomas

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