SQLServerのKEYSETカーソルについて覚えておくべき重要なポイントは次のとおりです。
- Selectクエリが一意のインデックスのないテーブルを使用している場合、KEYSETカーソルは単に静的カーソルに変換されます。 SelectQueryで使用しているすべてのテーブルに一意のインデックスがあることを確認してください。 KEYSETカーソルは、これらの一意の値を使用して行の一意の識別子を作成するため、これは重要です。
- カーソルが開いたら、ソーステーブルに行を挿入した場合。これらの挿入は、すでに開いているカーソルには表示されません。
- ベーステーブルの非キー値を更新すると、それらの変更がカーソルで表示されます。
- カーソルが開いているときにベーステーブルのキー列の値を更新してから、値を取得しようとした場合。 @@FETCH_STATUSは-2を返します。カーソル内で行われた、WHERE CURRENT OF句を含むキー列への更新は、カーソルの最後に表示されます。
- カーソルが開いているときにベーステーブルから行を削除してから、その行をカーソルでフェッチしようとすると、@@FETCH_STATUSは-2を返します。
- KEYSETカーソルはスクロール可能です。
Create table dbo.Customer ( CustomerId Int , CustomerName VARCHAR(100), StreetAddress VARCHAr(100), City VARCHAR(100), State CHAR(2)) go --Create Unique Index on CustomerID CREATE UNIQUE INDEX UQ_CustomerID ON dbo.Customer (CustomerID); --Insert few Records in Sample Table Insert into dbo.Customer Select 1,'Aamir shahzad','Test Street Address','Charlotte','NC' Union all Select 2,'M Raza','Test Street Address','Charlotte','NC' union all Select 3,'John Smith','Test Street Address','New York City','NY' union All Select 4,'Christy Richard','Test Street Address','Rio Rancho','NM' --Insert NEW Record Insert into dbo.Customer Select 5,'Robert Ladson','Pathway Street Address','High Point','NC' --Delete Records Delete from dbo.Customer Where CustomerID in (3,4) --Update All Record for NONKEY Column Update dbo.Customer set CustomerName='NO NAME' --Update Key Column value Update dbo.customer set CustomerID=9 where Customerid=3 --KEYSET CURSOR Script Declare @CustomerID INT Declare @CustomerNAme VARCHAR (100) DECLARE @StreetAddress VARCHAR(100) DECLARE @City VARCHAR(100) DECLARE @State CHAR(2) --DECLARE A CURSOR DECLARE CUR CURSOR KEYSET FOR Select CustomerID,CustomerName,StreetAddress,City,State from dbo.Customer --OPEN CURSOR OPEN CUR Print 'CURSOR IS OPEN' --FETCH NEXT RECORD FETCH NEXT FROM CUR INTO @CustomerID,@CustomerNAme,@StreetAddress,@City,@State WHILE @@FETCH_STATUS=0 BEGIN RAISERROR ('',0,1) WITH NOWAIT WAITFOR DELAY '00:00:15' --You can use CONCAT Function in SQL 2012 AND Latest for Contatenation of Integters and Strings --PRINT CONCAT(@CustomerID,' ',@CustomerNAme,' ',@StreetAddress,' ',@City,' ',@State) Print CAST(@CustomerID AS VARCHAR(10))+' '+@CustomerNAme+' '+@StreetAddress+' '+@City+' '+@State FETCH NEXT FROM CUR INTO @CustomerID,@CustomerNAme,@StreetAddress,@City,@State Print @@FETCH_STATUS END CLOSE CUR DEALLOCATE CUR
ビデオデモ:SQLServerのKEYSETカーソルとは何ですか。KEYSETカーソルのしくみ