2013-01-31 15 views

答えて

9

この決定を行うための特別な手順はありません。各テーブルを照会する必要があります。ここでは強引なソリューションです:上記の溶液中

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

データベース細くのための非常に便利です(私はドロップしなければならない多くの未使用の列があります:S)を使用すると、空になっているテーブルを除外したい場合は、次のようにクエリを調整するだけです。私はちょうど最後のSELECTにデータ型とOrder Byを追加しました。ありがとう! – Roimer

+0

上記のコードを実行すると、 "len関数の引数1の引数データ型のテキストが無効です"が発生します。代わりに** DATALENGTH **を使用する方が良いでしょうか? –

+0

@adolfgarlic - あなたは 'DataLength'関数を使うこともできます。 Len関数が 'text'データ型と' ntext'データ型ではバーフリングであると思われます。 – Thomas

関連する問題