2016-11-28 3 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

Не нужно курсору. Просто установите @Table в NULL

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 Неверный синтаксис рядом с ключевым словом «Column». – abs786123

+0

@ abs786123 Что еще вы изменили? – scsimon

Смежные вопросы