5
ブランク/ヌル/スペースまたはゼロ(表のリストを指定)として残された列。データベースで未使用の列を見つける方法(SQL Server 2008)
中央のシステムテーブルからテーブル定義と列定義を引き出すことができると仮定して、上記の条件をどのようにチェックする必要がありますか?
ブランク/ヌル/スペースまたはゼロ(表のリストを指定)として残された列。データベースで未使用の列を見つける方法(SQL Server 2008)
中央のシステムテーブルからテーブル定義と列定義を引き出すことができると仮定して、上記の条件をどのようにチェックする必要がありますか?
この決定を行うための特別な手順はありません。各テーブルを照会する必要があります。ここでは強引なソリューションです:上記の溶液中
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
)';
データベース細くのための非常に便利です(私はドロップしなければならない多くの未使用の列があります:S)を使用すると、空になっているテーブルを除外したい場合は、次のようにクエリを調整するだけです。私はちょうど最後のSELECTにデータ型とOrder Byを追加しました。ありがとう! – Roimer
上記のコードを実行すると、 "len関数の引数1の引数データ型のテキストが無効です"が発生します。代わりに** DATALENGTH **を使用する方が良いでしょうか? –
@adolfgarlic - あなたは 'DataLength'関数を使うこともできます。 Len関数が 'text'データ型と' ntext'データ型ではバーフリングであると思われます。 – Thomas