sql >> データベース >  >> RDS >> Sqlserver

SQLServerのカーソルタイプ-KEYSETカーソル| SQLServerチュートリアル/TSQLチュートリアル

    キーセットカーソルを開くと、カーソル内の行のメンバーシップと順序が固定されます。 KeySet Cursorは、Selectステートメントで使用する列から一意に作成された値を使用してTempDBに一時テーブルを作成します。

    SQLServerのKEYSETカーソルについて覚えておくべき重要なポイントは次のとおりです。


    • Selectクエリが一意のインデックスのないテーブルを使用している場合、KEYSETカーソルは単に静的カーソルに変換されます。 SelectQueryで使用しているすべてのテーブルに一意のインデックスがあることを確認してください。 KEYSETカーソルは、これらの一意の値を使用して行の一意の識別子を作成するため、これは重要です。
    • カーソルが開いたら、ソーステーブルに行を挿入した場合。これらの挿入は、すでに開いているカーソルには表示されません。
    • ベーステーブルの非キー値を更新すると、それらの変更がカーソルで表示されます。
    • カーソルが開いているときにベーステーブルのキー列の値を更新してから、値を取得しようとした場合。 @@FETCH_STATUSは-2を返します。カーソル内で行われた、WHERE CURRENT OF句を含むキー列への更新は、カーソルの最後に表示されます。
    • カーソルが開いているときにベーステーブルから行を削除してから、その行をカーソルでフェッチしようとすると、@@FETCH_STATUSは-2を返します。
    • KEYSETカーソルはスクロール可能です。
    ここでスナップショットとすべての詳細をまとめるのは困難です。ビデオを見て、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カーソルのしくみ

    1. 2つの別々のテーブルのデータを1つのカーソルに結合するにはどうすればよいですか?

    2. PostgreSQLにutf8照合をインストールする

    3. 一意の値の数を数える

    4. データベース内の部品表(BOM)構造の識別