SQL 尽管 table 中有很多记录,但服务器游标没有循环
SQL Server cursor is not looping although there are lots of records in the table
虽然 SELECT id, also FROM names WHERE isnull(also,'')<>''1
返回了 2000 多个结果,但以下光标没有循环,我得到:
@count = 0
代码:
DECLARE @id BIGINT, @name NVARCHAR(1000)
DECLARE @aslo TABLE (id INT, name NVARCHAR(100))
DECLARE name_cur CURSOR FOR
(SELECT id, also
FROM names
WHERE ISNULL(also, '') <> '')
DECLARE @count INT = 0
OPEN name_cur
WHILE @@FETCH_STATUS = 0
BEGIN
SET @count = @count + 1
INSERT INTO @aslo (id, name)
SELECT @id, *
FROM string_split(@name, ',')
FETCH NEXT FROM name_cur INTO @id, @name;
END
CLOSE name_cur;
DEALLOCATE name_cur;
SELECT @count
SELECT COUNT(*) FROM @aslo a
我认为不用游标来做这个要简单得多。这似乎等同于您想要执行的操作:
INSERT INTO @aslo (id, name)
SELECT n.id, ss.value as name
FROM names n CROSS APPLY
string_split(n.name, ',') ss;
Here 是一个 db<>fiddle.
虽然 SELECT id, also FROM names WHERE isnull(also,'')<>''1
返回了 2000 多个结果,但以下光标没有循环,我得到:
@count = 0
代码:
DECLARE @id BIGINT, @name NVARCHAR(1000)
DECLARE @aslo TABLE (id INT, name NVARCHAR(100))
DECLARE name_cur CURSOR FOR
(SELECT id, also
FROM names
WHERE ISNULL(also, '') <> '')
DECLARE @count INT = 0
OPEN name_cur
WHILE @@FETCH_STATUS = 0
BEGIN
SET @count = @count + 1
INSERT INTO @aslo (id, name)
SELECT @id, *
FROM string_split(@name, ',')
FETCH NEXT FROM name_cur INTO @id, @name;
END
CLOSE name_cur;
DEALLOCATE name_cur;
SELECT @count
SELECT COUNT(*) FROM @aslo a
我认为不用游标来做这个要简单得多。这似乎等同于您想要执行的操作:
INSERT INTO @aslo (id, name)
SELECT n.id, ss.value as name
FROM names n CROSS APPLY
string_split(n.name, ',') ss;
Here 是一个 db<>fiddle.