【发布时间】:2018-08-08 08:23:16
【问题描述】:
这是我试过的代码:
declare @o1 nvarchar(255)
declare @o2 nvarchar(255)
declare data cursor for
select o1.Name, o2.Name from MyDB.dbo.Table1 as o1, MyDB.dbo.MyTable2 as o2;
OPEN data;
-- Perform the first fetch.
FETCH NEXT FROM data into @o1, @o2;
-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
-- This is executed as long as the previous fetch succeeds.
FETCH NEXT FROM data INTO @o1, @o2;
Print 'Name1: ' + @o1
WHILE @@FETCH_STATUS = 0
BEGIN
-- This is executed as long as the previous fetch succeeds.
FETCH NEXT FROM data INTO @o1, @o2;
Print 'Name2: ' + @o2
END
END
CLOSE data;
DEALLOCATE data;
GO
我的查询中有两列,都是 nvarchar(255)。 我想将第一列的每个值与第二列的每个值进行比较。这可以通过循环内的循环来实现,但我不知道我应该如何处理光标部分。
我应该放置一个变量并分别保持获取状态吗? 还是其他方法可以解决问题?
【问题讨论】:
-
您能提供一些示例数据并期待结果吗?
-
为什么要比较这两列?通过使用基于集合的查询,您可以在不使用游标的情况下比较它们。评论您的代码:您在
Print 'Name1: ' + @o1之前提取了两次,因此第一次提取的值丢失了。然后在使用@o2之前再次获取,因此分配给@o2的值(就在... 'Name1:' ...上方)丢失了。然后你只在最后一次提取后消耗@o2,所以最后一次提取的@o1也会丢失。此外,您用于光标的查询是笛卡尔积,因为您不以任何方式连接表。 -
当你使用游标时,最好先
declare你的游标,然后open,fetch,启动你的while @@fetch_status循环,在while循环中写代码来消费获取的值, 在while循环、close和deallcoate游标结束之前包含一个 fetch 语句。 -
根据您的描述,您不必既不使用游标也不使用循环,只需简单的连接查询即可达到所需的结果。提供一些示例数据,以便我为您提供最终查询。
-
这与您之前的问题有何不同?
标签: sql sql-server-2008 tsql