Comment find une colonne inutilisée dans une database (SQL Server 2008).

colonnes qui sont laissées comme vide / null / espace ou zéro (donné une list de tables).

En supposant que je puisse extraire les définitions de tables et de colonnes des tables du système central, comment dois-je vérifier la condition ci-dessus?

Il n'existe aucune procédure spéciale à l'intérieur de SQL Server pour effectuer cette détermination. Vous devez interroger chaque table. Voici une solution brute force:

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 

Un problème dans la solution ci-dessus est que toute colonne d'une table vide sera returnnée. Si vous souhaitez exclure des tables vides, vous devez seulement ajuster la requête à ce qui suit:

 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 )';