T-SQL动态行检查
我正在尝试对一个表进行检查,其中,对于每一行,我希望查看列中是否有空值,并添加1,如下所示:T-SQL动态行检查,sql,sql-server,dynamic,Sql,Sql Server,Dynamic,我正在尝试对一个表进行检查,其中,对于每一行,我希望查看列中是否有空值,并添加1,如下所示: SELECT ((CASE WHEN col1 IS NULL THEN 1 ELSE 0 END) + (CASE WHEN col2 IS NULL THEN 1 ELSE 0 END) + (CASE WHEN col3 IS NULL THEN 1 ELSE 0 END) ... ... + (CASE WHEN col10 IS NULL THEN 1 ELSE 0
SELECT
((CASE WHEN col1 IS NULL THEN 1 ELSE 0 END)
+ (CASE WHEN col2 IS NULL THEN 1 ELSE 0 END)
+ (CASE WHEN col3 IS NULL THEN 1 ELSE 0 END)
...
...
+ (CASE WHEN col10 IS NULL THEN 1 ELSE 0 END)) AS sum_of_nulls
FROM table
WHERE Customer=some_cust_id'
这个方法以静态的方式完成它应该做的事情,但是可以基于表动态地构建列,而不是写出每个case语句
非常感谢 这是我想到的
declare
@sql nvarchar(max),
@columns nvarchar(max),
@table nvarchar(128) = '<your table here>'
select
@columns = stuff((select '+case when ' + quotename(column_name) + ' is null then 1 else 0 end'
from information_schema.columns
where table_name = @table
order by ordinal_position
for xml path('')), 1, 1, ''),
@sql = 'select sum_of_nulls = ' + @columns + ', *
from dbo.' + quotename(@table)
exec sp_executesql @sql
如果需要,也可以在表名后插入where子句。现在,它只返回表中的所有内容。这就成功了。哇,我还有很长的路要走,从sql语句lol。很高兴它的工作。是的,那里发生了很多事情,但这里是最基本的。这些列存在于information_模式和sys.columns中,但我选择在这里使用informatoin_模式。for xml的时髦语法是将数据序列化为分隔字符串的一个小技巧。在本例中,在每列的开头用加号分隔。stuff函数只是用来去掉前面的加号。就是这样。你为什么不把加号留在那里?@AntonínLejsek如果你把前导加号留在那里,那是一个无效的声明。基本上我将每一行序列化为+case,当。。。。所以你会得到,例如,++。。。。看到前面的加号了吗?这就是我想要摆脱的。有几种方法可以使字符串有效,这是我最喜欢的。开头有一元加号的语句是有效的,这就是我为什么要问的原因。