我有一张大约有 20 列的表格。除了输入:
Where column1 is null OR column2 is null OR column3 is null etc...
是否有一种更快的方法来检查每一列并查看是否有任何值为空,如果是,则返回该记录?
不。有多种方法可以更快地进行编码,但没有像您暗示的那样的捷径。取自我在 dba.stackexchange 上给出的答案:
DECLARE @tb NVARCHAR(255), @sql NVARCHAR(MAX);
SET @tb = N'dbo.[table]';
SET @sql = N'SELECT * FROM ' + @tb + ' WHERE 1 = 0';
SELECT @sql = @sql + N' OR ' + QUOTENAME(name) + ' IS NULL'
FROM sys.columns
WHERE [object_id] = OBJECT_ID(@tb);
EXEC sp_executesql @sql;
您可以使用如下方式找到列名称:
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.Columns where TABLE_NAME = <table_name>
然后,我将使用它编写一个过程,它将循环遍历表中的条目和列名称。
这取决于更快意味着什么。
如果您的意思是让 SQL Server 执行得更快,您可以做的一件事是编写一个触发器,而不是更新指定整行(除了位和主键之外)是否为 NULL 的位列。但是,这样做应该有一个真正充分的理由,因为它会影响您的更新性能。这些列上的索引也会有所帮助。
如果您想要更快地编写,您可以让 SQL 为您生成 where 子句。但是,除非你经常这样做,否则我认为这是不值得花时间的。
授人以鱼而不是授人以鱼的答案在这里:
一种方法是创建一个存储过程来组装并运行动态查询。
存储过程将:
OR
语句动态组装字符串(实际查询)。您可以通过像这样进行 case 和 sum 来检查。在这里,只要我们看到空值和零,我们就标记 1,然后我们对所有值进行求和
SELECT
(case when (sum(case when id is null then 1 else 0 end)) > 0 then True else False end) as is_id_null,
(case when (sum(case when id is null then 1 else 0 end)) > 0 then True else False end) as is_name_null
from TABLE;
这也可能有帮助。它生成列出列名称以及表中每列中 NULL 值数量的脚本。获得输出后,您必须将其复制或导出为文本并将其作为脚本运行。
DECLARE @tb VARCHAR(100) = '<schema>.<tableName>'
SELECT 'SELECT col_name = ''' + sys_cols.name + ''', null_count = COUNT(*) FROM ' + @tb + ' WHERE ' + sys_cols.name + ' IS NULL;'
FROM sys.columns sys_cols
WHERE sys_cols.[object_id] = OBJECT_ID('' + @tb + '')