2016-10-11 2 views
0

カーソルの次のレコードを移動せずに取得しようとしています。すなわち、ピーク機能のようなものです。カーソル上のLEAD変数

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; 

はしかし、私はそれを示すエラーを取得::私はselect文を発行すると

The variable '@MyCursor' is a cursor variable, but it is used in a place where a cursor variable is not valid. 

、私はこのバックのようないくつかのデータを取得する可能性がありますここで私がこれまでに書かれているいくつかのSQLコードがあります

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

私の場合、ID5と6を比較して名前が一致するかどうかを確認することが重要です。そうであれば、7と8のように、私は後者のレコードを削除したい。そうでない場合、5と6のように、レコードだけを残したい

+0

が鳴り'%joe%'とM2.ID Cato

答えて

3

カーソル変数はFROMに属しません。ただ、クエリ自体に列を追加:あなたはdbo.My_TABLE.name「%のジョー%」のようなAND EXISTSは(M2.name dbo.My_TABLE M2から0を選択dbo.My_TABLEをDELETE行うことができますように

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

テーブル内の次のIDは、テーブル内の次のIDよりも1つ上のほうが高い場合があります。私は私の質問を更新して、私が何をしようとしているのか詳しく説明することができます。 – angryip

+0

この回答では、私はそれが高くても表示される必要はないと思います。 〜あなたが得るnext_idは、次のIDです。必ずしもid + 1 – Cato

+0

@angryipである必要はありません。 。 。私はこの答えと何が関係しているのか分かりません。これは 'where'条件に一致する次のidを取得します。 –

関連する問題