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)
您应该根据 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)
没有很好的内置语法,但是 Management Studio 有几个方便的功能可以快速生成查询。
在对象资源管理器中,深入到您想要的表,展开它,然后将整个“列”文件夹拖到一个空白的查询编辑器中。这将向查询添加以逗号分隔的列列表。
接下来,打开查找和替换。将“查找内容”,设置为并将“替换为”设置为IS NULL OR(带前导空格),然后点击全部替换。您必须手动清理序列中的最后一个。
它仍然很丑,但它的劳动密集型丑陋。