测试是否有任何列为 NULL

Dex*_*ter 18 sql-server-2008 null sql-server

我试图找出一个简单的查询,我可以做一个简单的查询来测试一个大表是否有一个条目列表,在任何列中至少有一个空白(NULL/空)值。

我需要类似的东西

SELECT * FROM table AS t WHERE ANY(t.* IS NULL)
Run Code Online (Sandbox Code Playgroud)

我不想做

SELECT * FROM table AS t WHERE t.c1 = NULL OR t.c2 = NULL OR t.c3 = NULL
Run Code Online (Sandbox Code Playgroud)

这将是一个巨大的查询。

Aar*_*and 19

@db2 答案的扩展,减少(读取:零)手动操作:

DECLARE @tb nvarchar(512) = N'dbo.[table]';

DECLARE @sql nvarchar(max) = N'SELECT * FROM ' + @tb
    + N' WHERE 1 = 0';

SELECT @sql += N' OR ' + QUOTENAME(name) + N' IS NULL'
    FROM sys.columns 
    WHERE [object_id] = OBJECT_ID(@tb)
    AND is_nullable = 1;

EXEC sys.sp_executesql @sql;
Run Code Online (Sandbox Code Playgroud)


Mar*_*ith 9

您应该根据 JNK 的评论列出所有列。

WHERE c1 IS NULL OR c2 IS NULL OR c3 IS NULL
Run Code Online (Sandbox Code Playgroud)

但是,避免这种情况的效率稍低的方法如下。

;WITH xmlnamespaces('http://www.w3.org/2001/XMLSchema-instance' AS ns) 
SELECT * 
FROM   YourTable AS T1 
WHERE (
    SELECT T1.* 
    FOR XML PATH('row'), ELEMENTS XSINIL, TYPE
  ).exist('//*/@ns:nil') = 1 
Run Code Online (Sandbox Code Playgroud)

(基于这个 SO 答案)


db2*_*db2 5

没有很好的内置语法,但是 Management Studio 有几个方便的功能可以快速生成查询。

在对象资源管理器中,深入到您想要的表,展开它,然后将整个“列”文件夹拖到一个空白的查询编辑器中。这将向查询添加以逗号分隔的列列表。

接下来,打开查找和替换。将“查找内容”,设置为并将“替换为”设置为IS NULL OR(带前导空格),然后点击全部替换。您必须手动清理序列中的最后一个。

它仍然很丑,但它的劳动密集型丑陋。