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カーソルのしくみ