2017-06-08 36 views
-1

我正在设置一组数据质量脚本对我的小组正在获取的一组新数据质量脚本。我想跟踪的其中一个问题是维护包含nulls的字段列表。有些字段可以,其他字段不可以,虽然我们不想阻止bulk insert,因为我们没有允许某些字段为nullT-SQL:如何查询导致列表的NULLS字段列表

例子:

SELECT [columns] 
FROM [TABLE] T 
WHERE [columns] CONTAINS NULLS 
+0

那又有什么问题呢?这听起来像你只是想知道不能为null的字段,在这种情况下,你可以查询列不为空的系统表:https://stackoverflow.com/questions/5204684/query-to-check-无论列是否为空或者您是否真的想知道特定的表统计信息以查看列是否允许Null或不允许?这可能是:https://stackoverflow.com/questions/16852021/how-can-i-inexpensively-determine-if-a-column-contains-only-null-records无论哪种方式,这似乎是一个重复的问题。 – xQbert

+0

更像第二个链接,但我只是希望结果显示该字段的名称,如果它包含数据中的NULL。这些字段允许空值,但我们理想的情况是不需要任何空值。 – plankton

+0

知道列有'非法'值对于数据质量脚本不是很有用。它不包含您需要修复问题的信息,也不包含导致该问题的原因的上下文。我建议触发器写坏行审计表。有了完整的记录,你实际上可以追查到你的麻烦来源并修复它。 – Greenspark

回答

1

你可以使用类似这样的功能环通的所有列,看看是否有表中的空值的计数。该代码是一种蛮力,但它会工作。

declare @tablename nvarchar(255) = 'schema.tablename' 

declare @results table (ColumnName nvarchar(255)) 

/* Declare the Variables to be used in the cusor*/ 
declare @column_name nvarchar(255) 


/* Declare the cursor and the value set that will be used*/ 
declare tbl_Crawler cursor 
    for SELECT name FROM sys.columns 
     WHERE object_id = OBJECT_ID(@tablename) 

/* Make the Cursor Available*/ 
open tbl_Crawler 

/*Load the first row into the variables (must match sequence in cursor select)*/ 
fetch next from tbl_Crawler 
    into @column_name 

/*Creates While loop that will run until the curor is empty*/ 
while @@fetch_status = 0 
    begin 

/*statement to be run every loop of the cursor*/ 

    DECLARE @sqlCommand nvarchar(1000) 

    declare @counts int 

    SET @sqlCommand = 'SELECT @cnt=COUNT(*) FROM '[email protected]+' WHERE '+ @column_name + ' is null' 
    EXECUTE sp_executesql @sqlCommand, N'@cnt int OUTPUT', @[email protected] OUTPUT 


    if (isnull(@counts,0) > 0) 
     insert into @results 
     select @column_name 

/*Loads the next row of records into the variables (must match sequence in cursor select)*/ 
    fetch next from tbl_Crawler 
     into @column_name 
    end 
/*Release the cursor so that it is not retained in memory*/ 
close tbl_Crawler 
deallocate tbl_Crawler 

/* if in function return @results*/ 
    select * from @results 
+0

您应该在['QuoteName'](https://docs.microsoft.com/zh-cn/sql/t-sql/functions/quotename-transact-sql)中包装表和列名称变量,以避免出现问题“有趣”的名字,例如一个名为'Shoe Size'的列有一个空格。 – HABO

+0

你是绝对正确的。该代码确实留下了一些不足之处。 – SFrejofsky

1

这是缓慢的,丑陋的,但短期从展鹏购买工具(等人),你也许可以用ISNULL(@列,“选我”)来搜索来修改它的你nulls ...

DECLARE @Query NVARCHAR(MAX), @Column NVARCHAR(100), @Table NVARCHAR(100) 
DECLARE @Search NVARCHAR(100) 
SET @Search = 'PICK ME' 

IF OBJECT_ID('tempdb.dbo.#Results2','U') IS NOT NULL 
    DROP TABLE tempdb.dbo.#Results2 

CREATE TABLE #Results2(Table_Name VARCHAR(100), Column_Name VARCHAR(100)) 

DECLARE Col CURSOR FOR 
SELECT Table_Name, Column_Name 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLLATION_NAME IS NOT NULL 
ORDER BY TABLE_NAME, ORDINAL_POSITION 

OPEN Col 
FETCH NEXT FROM Col INTO @Table, @Column 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @Query = 'IF EXISTS (SELECT * FROM '+QUOTENAME(@Table)+' WHERE '+QUOTENAME(@Column)+'='''[email protected]+''') 
        SELECT '''[email protected]+''','''[email protected]+'''' 

    INSERT INTO #Results2 
    EXEC sp_executesql @Query 
    FETCH NEXT FROM Col INTO @Table, @Column 
END 
CLOSE Col 
DEALLOCATE Col 

SELECT * FROM #Results2