5
공백/공백/공백 또는 0으로 남겨진 열 (테이블 목록이 있음).데이터베이스에서 사용되지 않는 열을 찾는 방법 (SQL Server 2008).
중앙 시스템 테이블에서 테이블 및 열 정의를 가져올 수 있다고 가정 할 때 위의 조건을 어떻게 확인해야합니까?
공백/공백/공백 또는 0으로 남겨진 열 (테이블 목록이 있음).데이터베이스에서 사용되지 않는 열을 찾는 방법 (SQL Server 2008).
중앙 시스템 테이블에서 테이블 및 열 정의를 가져올 수 있다고 가정 할 때 위의 조건을 어떻게 확인해야합니까?
이 결정을 내리기위한 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
)';
데이터베이스 튜닝에 매우 유용합니다. 사용하지 않는 열이 많이 있습니다. 난 그냥 마지막 SELECT에 데이터 형식과 주문 바이를 추가했습니다. 감사! – Roimer
위 코드를 실행할 때 "인수 데이터 형식 텍스트가 len 함수의 인수 1에 유효하지 않습니다."가 발생합니다. ** DATALENGTH **를 대신 사용하는 것이 좋습니까? –
@adolfgarlic - 당신은 또한'DataLength' 함수를 사용할 수 있습니다. Len 함수가'text' 및'ntext' 데이터 유형에 대해 barfing일지도 모른다고 생각합니다. – Thomas