Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL动态行检查_Sql_Sql Server_Dynamic - Fatal编程技术网

T-SQL动态行检查

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

我正在尝试对一个表进行检查,其中,对于每一行,我希望查看列中是否有空值,并添加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 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,当。。。。所以你会得到,例如,++。。。。看到前面的加号了吗?这就是我想要摆脱的。有几种方法可以使字符串有效,这是我最喜欢的。开头有一元加号的语句是有效的,这就是我为什么要问的原因。