Sql server 记录按字段名计数。动态结构化查询语言

Sql server 记录按字段名计数。动态结构化查询语言,sql-server,Sql Server,任务是,为值为“”的表中的每列计算记录数 例如,表MARA有“LVORM”列,因此我的查询如下所示: select count(*) from MARA where LVORM = '' 我所做的是创建游标脚本: declare @TABLE_NAME varchar(50), @COLUMN_NAME varchar(50), @NOBLANKS INT, @q nvarchar(max); DECLARE cur_headers CURSOR STATIC FOR SELECT to

任务是,为值为“”的表中的每列计算记录数

例如,表MARA有“LVORM”列,因此我的查询如下所示:

select count(*) from MARA where LVORM = '' 
我所做的是创建游标脚本:

declare @TABLE_NAME varchar(50), @COLUMN_NAME varchar(50), @NOBLANKS INT, @q  nvarchar(max);

DECLARE cur_headers CURSOR
STATIC FOR SELECT top 50 TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'MARA' and COLUMN_NAME = 'LVORM'
OPEN cur_headers
IF @@CURSOR_ROWS > 0
 BEGIN 
 FETCH NEXT FROM cur_headers INTO @TABLE_NAME, @COLUMN_NAME
 WHILE @@Fetch_status = 0
 BEGIN
    set @NOBLANKS = 0;
    select  @q = 'select @NOBLANKS = count(*) from MARA where ' + @COLUMN_NAME + ' = '''' ';
    exec(@q)
    select @NOBLANKS;
    select @q;
 FETCH NEXT FROM cur_headers INTO @TABLE_NAME, @COLUMN_NAME
 END
END
CLOSE cur_headers
DEALLOCATE cur_headers
SET NOCOUNT OFF 
由于某些原因,我无法在变量
@NOBLANKS
@q
返回正确的查询


知道为什么吗

您需要传递变量:

select  @q = 'select @NOBLANKS = count(*) from MARA where ' + @COLUMN_NAME + ' = '''' ';
exec(@q)
=>


分号是可选的,但最好以分号结尾。毕竟,我们为人类编写代码

EXEC sp_executesql 
     N'select @NOBLANKS = count(*) from MARA where ' + @COLUMN_NAME + ' = '''' ',
     N'@NOBLANKS INT OUT',
     @NOBLANKS OUT;
DECLARE cur_headers CURSOR STATIC FOR 
SELECT top 50 TABLE_NAME, COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'MARA';
  --AND COLUMN_NAME = 'LVORM';
  -- here the COLUMN_NAME is defaulted to `LVORM` so it should be removed