2013-01-31 3 views

답변

9

이 결정을 내리기위한 SQL Server 내부의 특별한 절차는 없습니다. 각 테이블을 쿼리해야합니다. 다음은 무력 솔루션입니다 : 위의 솔루션

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

데이터베이스 튜닝에 매우 유용합니다. 사용하지 않는 열이 많이 있습니다. 난 그냥 마지막 SELECT에 데이터 형식과 주문 바이를 추가했습니다. 감사! – Roimer

+0

위 코드를 실행할 때 "인수 데이터 형식 텍스트가 len 함수의 인수 1에 유효하지 않습니다."가 발생합니다. ** DATALENGTH **를 대신 사용하는 것이 좋습니까? –

+0

@adolfgarlic - 당신은 또한'DataLength' 함수를 사용할 수 있습니다. Len 함수가'text' 및'ntext' 데이터 유형에 대해 barfing일지도 모른다고 생각합니다. – Thomas

관련 문제