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

クエリによって返された行ごとにストアドプロシージャを1回実行するにはどうすればよいですか?

    カーソルを使用する

    補遺:[MSSQLカーソルの例]

    declare @field1 int
    declare @field2 int
    declare cur CURSOR LOCAL for
        select field1, field2 from sometable where someotherfield is null
    
    open cur
    
    fetch next from cur into @field1, @field2
    
    while @@FETCH_STATUS = 0 BEGIN
    
        --execute your sproc on each row
        exec uspYourSproc @field1, @field2
    
        fetch next from cur into @field1, @field2
    END
    
    close cur
    deallocate cur
    

    MS SQLでは、ここにサンプル記事があります

    カーソルはセットベースの操作よりも低速ですが、手動のwhileループよりは高速であることに注意してください。このSOの質問の詳細

    補遺2:数個以上のレコードを処理する場合は、最初にそれらを一時テーブルにプルして、一時テーブル上にカーソルを置きます。これにより、SQLがテーブルロックにエスカレートするのを防ぎ、操作を高速化できます

    補遺3:もちろん、ストアドプロシージャが各ユーザーIDに対して実行していることをすべてインライン化し、すべてを単一のSQL更新ステートメントとして実行できる場合は、それが最適です



    1. PostgreSQLで列を動的に生成する

    2. PostgreSQL正規表現の単語境界?

    3. MySQLのあるテーブルから別の新しいテーブルにデータをコピーするにはどうすればよいですか?

    4. MySQLでは列名とテーブル名で大文字と小文字が区別されますか?