Sql 引导光标变量

Sql 引导光标变量,sql,sql-server,window-functions,database-cursor,Sql,Sql Server,Window Functions,Database Cursor,我试图在不移动光标的情况下获取光标中的下一条记录。i、 e类似于peek函数。以下是我迄今为止编写的一些sql代码: DECLARE @Id varchar(80), @Name varchar(80), @NextId varchar(80) BEGIN SET @MyCursor = CURSOR FOR SELECT id,name FROM dbo.My_TABLE WHERE name like '%joe%';

我试图在不移动光标的情况下获取光标中的下一条记录。i、 e类似于peek函数。以下是我迄今为止编写的一些sql代码:

DECLARE
    @Id     varchar(80),
    @Name   varchar(80),
    @NextId varchar(80)

BEGIN

    SET @MyCursor = CURSOR FOR
    SELECT id,name FROM dbo.My_TABLE
    WHERE name like '%joe%';

    OPEN @MyCursor 
        FETCH NEXT FROM @MyCursor 
    INTO @Id, @Name

    WHILE @@FETCH_STATUS = 0
    BEGIN
        print 'Id is :: ' + cast(@Id as varchar(80)) + ' : ' + @Name
        SELECT @NextId=id, LEAD (id,1) OVER (ORDER BY id) FROM @MyCursor;
        print 'The next record is :: ' + @NextId
        FETCH NEXT FROM @MyCursor 
        INTO @Id, @Name
    END; 
但是,我得到一个错误,指出:

The variable '@MyCursor' is a cursor variable, but it is used in a place where a cursor variable is not valid.
当我发出select语句时,我可能会得到一些类似这样的数据

----+------
ID    NAME
----+------
5   + Joes
6   + FakeJoe
7   + Joes
8   + Joes
9   + MikeJoes

对我来说,比较ID5和ID6以查看名称是否匹配很重要。如果是,比如7和8,我想删除后一条记录。如果没有,比如5和6,我想让记录保持独立

游标变量不属于FROM。只需向查询本身添加一列:

SELECT id, name,
       LEAD(id) OVER (ORDER BY id) as next_id
FROM dbo.My_TABLE
WHERE name like '%joe%';

游标变量不属于FROM中。只需向查询本身添加一列:

SELECT id, name,
       LEAD(id) OVER (ORDER BY id) as next_id
FROM dbo.My_TABLE
WHERE name like '%joe%';

表中的下一个id不能按顺序高于表中的1。我会更新我的问题,这样我就可以在这个给定的答案中详细说明我正在尝试做什么,我不认为它确实需要高出正好一才能出现~你得到的下一个id将是下一个id,不一定是id+1@angryip . . . 我不明白这和这个答案有什么关系。这将获取与where条件匹配的下一个id。@GordonLinoff啊,你是对的。我的印象是,当您执行lead时,如果不在同一个游标上发出查询,则结果可能不匹配。表中的下一个id可能不会依次高于表中的1。我会更新我的问题,这样我就可以在这个给定的答案中详细说明我正在尝试做什么,我不认为它确实需要高出正好一才能出现~你得到的下一个id将是下一个id,不一定是id+1@angryip . . . 我不明白这和这个答案有什么关系。这将获取与where条件匹配的下一个id。@GordonLinoff啊,你是对的。我的印象是,当你做一个潜在客户,而不是在同一个游标上发出查询,结果可能不匹配。听起来您可以删除dbo.My_TABLE WHERE dbo.My_TABLE.name类似“%joe%”并且存在从dbo.My_TABLE M2 WHERE M2.name类似“%joe%”和M2.ID