我正在设置一组数据质量脚本对我的小组正在获取的一组新数据质量脚本。我想跟踪的其中一个问题是维护包含nulls
的字段列表。有些字段可以,其他字段不可以,虽然我们不想阻止bulk insert
,因为我们没有允许某些字段为null
。T-SQL:如何查询导致列表的NULLS字段列表
例子:
SELECT [columns]
FROM [TABLE] T
WHERE [columns] CONTAINS NULLS
我正在设置一组数据质量脚本对我的小组正在获取的一组新数据质量脚本。我想跟踪的其中一个问题是维护包含nulls
的字段列表。有些字段可以,其他字段不可以,虽然我们不想阻止bulk insert
,因为我们没有允许某些字段为null
。T-SQL:如何查询导致列表的NULLS字段列表
例子:
SELECT [columns]
FROM [TABLE] T
WHERE [columns] CONTAINS NULLS
你可以使用类似这样的功能环通的所有列,看看是否有表中的空值的计数。该代码是一种蛮力,但它会工作。
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
您应该在['QuoteName'](https://docs.microsoft.com/zh-cn/sql/t-sql/functions/quotename-transact-sql)中包装表和列名称变量,以避免出现问题“有趣”的名字,例如一个名为'Shoe Size'的列有一个空格。 – HABO
你是绝对正确的。该代码确实留下了一些不足之处。 – SFrejofsky
这是缓慢的,丑陋的,但短期从展鹏购买工具(等人),你也许可以用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
那又有什么问题呢?这听起来像你只是想知道不能为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
更像第二个链接,但我只是希望结果显示该字段的名称,如果它包含数据中的NULL。这些字段允许空值,但我们理想的情况是不需要任何空值。 – plankton
知道列有'非法'值对于数据质量脚本不是很有用。它不包含您需要修复问题的信息,也不包含导致该问题的原因的上下文。我建议触发器写坏行审计表。有了完整的记录,你实际上可以追查到你的麻烦来源并修复它。 – Greenspark