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)
那么你可以做这样的事情,这将避免你最初发布的查询中的光标。首先,更改列表的定义,如下所示:
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)
请注意,根据您表中的行数,这可能需要一段时间......
我希望这可以帮助你。
| 归档时间: |
|
| 查看次数: |
3130 次 |
| 最近记录: |