SQL 服务器:只有游标 returns 在 Management Studio 中 运行 第一次记录
SQL Server: cursor only returns records first time when running in Management Studio
我希望有人能帮助解决这个问题!我正在尝试编写一个使用游标的存储过程。当我在 Management Studio 中对此进行测试时,存储过程仅 returns 记录第一次 运行。如果我 copy/past 到另一个查询 window,它再次 returns 只记录第一次。当来自 C# 的 运行 时,存储过程按预期工作。
下面的查询说明了这个问题。提前致谢!
-------------------------------------------------------------------
-- Query to reproduce problem with using cursor - management studio
-------------------------------------------------------------------
--
Declare crsrTest Cursor For
Select TABLE_NAME
From INFORMATION_SCHEMA.TABLES;
Declare @TableName varchar(128);
Open crsrTest;
--
-- This will only return records the *first* time when running in MS.
-- Every time after that, I get the 'No records' message.
--
if @@FETCH_STATUS <> 0
Print 'No records';
while @@FETCH_STATUS = 0 begin
Fetch Next
From crsrTest
Into @TableName;
Print @TableName;
end;
Close crsrTest;
Deallocate crsrTest;
您在 OPEN
和 IF @@FETCH_STATUS <> 0
之间缺少一个 FETCH NEXT
:
DECLARE crsrTest CURSOR FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES;
DECLARE @TableName VARCHAR(128);
OPEN crsrTest;
FETCH NEXT FROM crsrTest INTO @TableName;
PRINT @TableName;
-- This will always return records
IF @@FETCH_STATUS <> 0
PRINT 'No records';
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM crsrTest INTO @TableName;
PRINT @TableName;
END;
CLOSE crsrTest;
DEALLOCATE crsrTest;
如果可以,请远离游标(您似乎是新手,这就是我告诉您的原因)。如果您是 ORACLE 用户,这不如 PL/SQL.
中的迭代快
我希望有人能帮助解决这个问题!我正在尝试编写一个使用游标的存储过程。当我在 Management Studio 中对此进行测试时,存储过程仅 returns 记录第一次 运行。如果我 copy/past 到另一个查询 window,它再次 returns 只记录第一次。当来自 C# 的 运行 时,存储过程按预期工作。
下面的查询说明了这个问题。提前致谢!
-------------------------------------------------------------------
-- Query to reproduce problem with using cursor - management studio
-------------------------------------------------------------------
--
Declare crsrTest Cursor For
Select TABLE_NAME
From INFORMATION_SCHEMA.TABLES;
Declare @TableName varchar(128);
Open crsrTest;
--
-- This will only return records the *first* time when running in MS.
-- Every time after that, I get the 'No records' message.
--
if @@FETCH_STATUS <> 0
Print 'No records';
while @@FETCH_STATUS = 0 begin
Fetch Next
From crsrTest
Into @TableName;
Print @TableName;
end;
Close crsrTest;
Deallocate crsrTest;
您在 OPEN
和 IF @@FETCH_STATUS <> 0
之间缺少一个 FETCH NEXT
:
DECLARE crsrTest CURSOR FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES;
DECLARE @TableName VARCHAR(128);
OPEN crsrTest;
FETCH NEXT FROM crsrTest INTO @TableName;
PRINT @TableName;
-- This will always return records
IF @@FETCH_STATUS <> 0
PRINT 'No records';
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM crsrTest INTO @TableName;
PRINT @TableName;
END;
CLOSE crsrTest;
DEALLOCATE crsrTest;
如果可以,请远离游标(您似乎是新手,这就是我告诉您的原因)。如果您是 ORACLE 用户,这不如 PL/SQL.
中的迭代快