用于检查表中缺失字段的存储过程

Vaz*_*gen 3 sql-server stored-procedures gaps-and-islands

我有一个存储过程,它接受一个字符串参数,一个逗号分隔的所需列名列表,SP 应该检查特定表并确保这些列中有数据......如果这些列中有任何记录丢失数据,则 sp应该返回recordID缺少数据的列和哪些列。

我在构建最终查询时遇到问题。我已经将逗号分隔列表拆分为一个表变量。并且正在使用游标浏览每个必需的列

DECLARE columnCursor CURSOR
    FOR SELECT * FROM @columnsTable
  OPEN columnCursor

  DECLARE @currentColumnName nvarchar(256);
  FETCH NEXT FROM columnCursor INTO @currentColumnName
  WHILE(@@FETCH_STATUS = 0)
  BEGIN

    ....

     FETCH NEXT FROM columnCursor INTO @currentColumnName
  END  
Run Code Online (Sandbox Code Playgroud)

Wor*_*DBA 5

那么你可以做这样的事情,这将避免你最初发布的查询中的光标。首先,更改列表的定义,如下所示:

DECLARE @columns TABLE
(
    ID INT IDENTITY NOT NULL,
    NAME NVARCHAR(128) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

然后,使用您拥有的任何方法;拆分字符串并填充上表。之后,您可以执行以下操作以获得所需的结果:

编辑:根据您在下面的评论更改了循环的主体。

CREATE TABLE ##results
(
    RecordID INT NOT NULL,
    ColumnName NVARCHAR(128) NOT NULL
);

DECLARE @i INT = 1;
DECLARE @j INT = (SELECT MAX(ID) FROM @columns);
DECLARE @c NVARCHAR(128); -- used to store column name
DECLARE @s NVARCHAR(max); -- to store the command....

WHILE(@i <= @j)
BEGIN
SET @c = (SELECT NAME FROM @columns WHERE ID = @i);

IF @i > 1
    SET @s += 'OR (' + @c + ' IS NULL) ';
ELSE
    SET @s += '(' + @c + ' IS NULL) ';

SET @s = 'INSERT ##results SELECT RecordID, ''' 
       + @c + ''' FROM some.table WHERE ' 
       + @c + ' IS NULL; '
@i += 1;
END
EXECUTE (@s);

SELECT * FROM ##results;
DROP TABLE ##results;
Run Code Online (Sandbox Code Playgroud)

请注意,根据您表中的行数,这可能需要一段时间......

我希望这可以帮助你。