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

SQLServerのカーソルタイプ-ローカルカーソルとグローバルカーソルの違いは何ですか。 SQLServerチュートリアル/TSQLチュートリアル

    ローカルカーソル:

    ローカルカーソルの範囲は、それが作成されたバッチ、ストアドプロシージャ、またはトリガーに制限されます。バッチ、ストアドプロシージャ、またはトリガーが完了したら。ローカルカーソルは使用できなくなります。

    グローバルカーソル:

    GLOBALカーソルの範囲は、それが作成された接続に限定されます。 GLOBAL CURSORは複数のバッチで使用でき、最初に開いて2番目にデータをフェッチできます。同じ接続を使用している限り、1つのストアドプロシージャでGLOBAL CURSORを開き、次のストアドプロシージャでデータをフェッチすることもできます。
    キーワードLocalまたはGlobalを使用しない場合、カーソルは次のように作成されます。以下のようにデータベース設定を使用して入力します。
    図1:SQLServerのローカルカーソルとグローバルカーソルの違い
    作成しましょうサンプルテーブルといくつかのレコードを挿入し、テストを実行して上記の定義を証明します。

    --drop table dbo.Customer
    Create table dbo.Customer ( 
    CustomerId Int ,
    CustomerName VARCHAR(100),
    StreetAddress VARCHAr(100),
    City VARCHAR(100),
    State CHAR(2))
    go
    
    --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'
    
    
    
    
    --Test with GLOBAL Cursor in Multiple Batches. 
    use Test
    go
    
    DECLARE Customer_Cursor CURSOR 
    --use LOCAL OR GLOBAL HERE
    GLOBAL 
    FOR
    Select CustomerID,
    CustomerName,
    StreetAddress,
    City,
    State
    from dbo.Customer
    OPEN Customer_Cursor;
    GO
    
    --Terminate the Batch and change the Database 
    use TestDB
    go
    FETCH NEXT FROM Customer_Cursor
    WHILE (@@FETCH_STATUS <> -1)
    BEGIN
       FETCH NEXT FROM Customer_Cursor 
       END
    CLOSE Customer_Cursor;
    GO
    DEALLOCATE Customer_Cursor;
    GO
    
    We will be able to see the records as we have defined Cursor as GLOBAL and it will be 
    available during entire Connection , even we have terminated the first Batch by using GO
    statement.
    
    
    Fig 2: Global Cursor in SQL Server
    --Test with LOCAL Cursor in Multiple Batches. 
    use Test
    go
    
    DECLARE Customer_Cursor CURSOR 
    --use LOCAL OR GLOBAL HERE
    LOCAL 
    FOR
    Select CustomerID,
    CustomerName,
    StreetAddress,
    City,
    State
    from dbo.Customer
    OPEN Customer_Cursor;
    GO
    
    --Terminate the Batch and change the Database 
    use TestDB
    go
    FETCH NEXT FROM Customer_Cursor
    WHILE (@@FETCH_STATUS <> -1)
    BEGIN
       FETCH NEXT FROM Customer_Cursor 
       END
    CLOSE Customer_Cursor;
    GO
    DEALLOCATE Customer_Cursor;
    GO
     
     
    As the scope for LOCAL Cursor is limited to Batch, Stored Procedure or Trigger, The second batch is not able to see the Cursor as we have defined LOCAL Cursor type in our above query
    図3:SQLServerのローカルカーソル
     

    次に、ストアドプロシージャを使用してテストを実行し、SQLServerのストアドプロシージャでローカルカーソルとグローバルカーソルがどのように機能するかを確認します。
    --Test with LOCAL Cursor in Multiple Batches. 
    use Test
    go
    
    Create Procedure Dec_Cursor_Customer AS
    BEGIN
    DECLARE Customer_Cursor CURSOR 
    --use LOCAL OR GLOBAL HERE
    GLOBAL 
    FOR
    Select CustomerID,
    CustomerName,
    StreetAddress,
    City,
    State
    from dbo.Customer
    OPEN Customer_Cursor;
    END
    
    GO
    Create Procedure Fetch_Cusor_Customer
    AS 
    BEGIN
    FETCH NEXT FROM Customer_Cursor
    WHILE (@@FETCH_STATUS <> -1)
    BEGIN
       FETCH NEXT FROM Customer_Cursor 
       END
    END
    
    --Execute the Procedures to What we get with GLOBAL and LOCAL Cursor Type
    
    EXEC Dec_Cursor_Customer
    GO
    EXEC Fetch_Cusor_Customer
    CLOSE Customer_Cursor;
    GO
    DEALLOCATE Customer_Cursor;
    GO
    で取得した手順を実行します。
     
     
    上記のストアドプロシージャを実行すると、図2のような結果が得られます。GLOBALタイプとして宣言しているため、複数のストアドプロシージャで実行する限り、複数のストアドプロシージャで使用できます。同じ接続。

    先に進み、ストアドプロシージャを変更し、タイプをGLOBALからLocalに変更してから、プロシージャを実行します。同じ接続でも、図3で取得したエラーが発生します。LOCALとして定義すると、カーソルのスコープがバッチ、ストアドプロシージャ、またはトリガーに制限されるためです。
    ビデオデモ:ローカルカーソルとグローバルカーソルがどのように機能するかについての詳細なデモを見るには、ビデオをご覧ください。
    1. NoSQLデータベースの利点–知っておくべきことすべて

    2. データベース+Windows認証+ユーザー名/パスワード?

    3. グリッドビューで複数の画像を設定できませんか?

    4. Oracleでテーブル、ビュー、シノニムのすべてのインデックスとその列を検索する方法