2016-11-28 30 views
0

我有以下SQL:SQL计数每列的所有表中的所有空的SYS表

SET NOCOUNT ON 
DECLARE @Schema NVARCHAR(100) = 'dbo' 
DECLARE @Table NVARCHAR(100) = NULL 
DECLARE @sql NVARCHAR(MAX) ='' 
IF OBJECT_ID ('tempdb..#Nulls') IS NOT NULL DROP TABLE #Nulls 

CREATE TABLE #Nulls (TableName sysname, ColumnName sysname, ColumnPosition int 
, NullCount int , NonNullCount int) 

SELECT @sql += 'SELECT '''+TABLE_NAME+''' AS TableName ,  

'''+COLUMN_NAME+''' AS ColumnName, '''+CONVERT(VARCHAR(5),ORDINAL_POSITION)+'''AS ColumnPosition,  
SUM(CASE WHEN '+COLUMN_NAME+' IS NULL THEN 1 ELSE 0 END) CountNulls , 
COUNT(' +COLUMN_NAME+') CountnonNulls FROM 
'+QUOTENAME(TABLE_SCHEMA)+'.'+QUOTENAME(TABLE_NAME)+';'+ CHAR(10) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = @Schema AND (@Table IS NULL OR TABLE_NAME = @Table) 

INSERT INTO #Nulls 
EXEC sp_executesql @sql 

SELECT * 
FROM #Nulls 

此经过计算所有的空值我希望它的方式。不过,我想在一个目录在每个表使用此SQL循环例如在

information.schema.table 

是否有人可以提供这样做所需的SQL,我使用游标完全一无所知。

谢谢

回答

1

不需要游标。只需设置你的@TableNULL

DECLARE @Table NVARCHAR(100) = NULL

然后你WHERE条款从这个

WHERE TABLE_SCHEMA = @Schema AND TABLE_NAME = @Table

改变WHERE TABLE_SCHEMA = @Schema AND (@Table IS NULL OR TABLE_NAME = @Table)

所以整个代码...

SET NOCOUNT ON 
DECLARE @Schema NVARCHAR(100) = 'dbo' 
DECLARE @Table NVARCHAR(100) = NULL 
DECLARE @sql NVARCHAR(MAX) ='' 
IF OBJECT_ID ('tempdb..#Nulls') IS NOT NULL DROP TABLE #Nulls 

CREATE TABLE #Nulls (TableName sysname, ColumnName sysname, ColumnPosition int 
, NullCount int , NonNullCount int) 

SELECT @sql += 'SELECT '''+TABLE_NAME+''' AS TableName ,  

'''+COLUMN_NAME+''' AS ColumnName, '''+CONVERT(VARCHAR(5),ORDINAL_POSITION)+'''AS ColumnPosition,  
SUM(CASE WHEN '+COLUMN_NAME+' IS NULL THEN 1 ELSE 0 END) CountNulls , 
COUNT(' +COLUMN_NAME+') CountnonNulls FROM 
'+QUOTENAME(TABLE_SCHEMA)+'.'+QUOTENAME(TABLE_NAME)+';'+ CHAR(10) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = @Schema AND (@Table IS NULL OR TABLE_NAME = @Table) 

INSERT INTO #Nulls 
EXEC sp_executesql @sql 

SELECT * 
FROM #Nulls 
+0

'和COALESCE(@ Table,TABLE_NAME)= TABLE_NAME'或'AND NULLIF(@ Table,TABLE_NAME)= TABLE_NAME' – Hogan

+0

我收到错误:Msg 156,Level 15,State 1,Line 406 语法附近的语法错误关键字'列'。 Msg 156,Level 15,State 1,Line 412 关键字'列'附近的语法不正确。 – abs786123

+0

@ abs786123你还改变了什么? – scsimon

相关问题