इस दृढ़ संकल्प के लिए SQL सर्वर के अंदर कोई विशेष प्रक्रिया नहीं है। आपको प्रत्येक तालिका से पूछताछ करने की आवश्यकता है। यहाँ एक जानवर बल समाधान है:
ऊपर समाधान में
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
)';
डेटाबेस ट्यूनिंग के लिए बहुत उपयोगी (: एस मैं एक बहुत अप्रयुक्त स्तंभों मैं कम हो जाना चाहिए है)। मैंने अभी अंतिम चयन तक डेटा प्रकार और ऑर्डर जोड़ा है। धन्यवाद! – Roimer
"उपरोक्त कोड चलाते समय" लेन डेटा के तर्क 1 के लिए तर्क डेटा प्रकार टेक्स्ट अमान्य है "होता है। क्या इसके बजाय ** DATALENGTH ** का उपयोग करना बेहतर होगा? –
@adolfgarlic - आप 'डेटालेथेंथ' फ़ंक्शन का भी उपयोग कर सकते हैं। मुझे संदेह है कि लेन फ़ंक्शन 'टेक्स्ट' और' ntext' डेटाटाइप पर बारफिंग हो सकता है। – Thomas