2017-07-26 45 views
1

BEGIN TRANSACTIONとwhileループをSQL Serverで使用する方法?SQL ServerでBEGIN TRANSACTIONをwhileループで使用する方法?

1つの行(@cnt = 1)を挿入した後にCOMMIT TRANSACTIONを停止して検索するが、COMMIT TRANSACTIONにしたくないため、このクエリは終了しない可能性があります。

BEGIN TRANSACTION 
    DECLARE @cnt INT = 0; 

    WHILE @cnt <= 100 
    BEGIN 
     DECLARE @offset INT = 1 

     INSERT INTO totalSales (col1, col2) 
      SELECT 
       'Col1', ROW_NUMBER() OVER (ORDER BY col2) + @offset 
      FROM 
       sales 

     SET @cnt = @cnt + 1; 
    END; 

whileループでコミットする前にどのように結果を確認できますか?

+0

ない場合あなたは同じバッチで、またはバッチの外でそれを見たいですか? – Pred

+0

同じバッチでコミットする前に結果を確認したい – shaadi

+0

@shaadiここでwhileループは何ですか? – Coder1991

答えて

0

同じトランザクション内で、SELECTコマンドを実行するだけで、テーブルの更新内容を確認できます。 COMMIT TRANSACTIONステートメントが実行されるか、ROLLBACKに戻されると、変更は維持されます。

CREATE TABLE test (id INT IDENTITY(1,1), x VARCHAR(32)); 
GO 

BEGIN TRANSACTION; 

INSERT INTO test (x) VALUES ('a'); 
INSERT INTO test (x) VALUES ('b'); 

SELECT * FROM test; 

ROLLBACK TRANSACTION; 

例:http://sqlfiddle.com/#!6/e4910/2

また、あなたが出力にINSERT文の結果をINSERT INTO .. OUTPUT構文を使用することができます。

ドキュメント:https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql

(第2の接続を使用して)バッチ外では、あなたはまだコミットしていないレコードを読み取ることができるようにREAD UNCOMMITTED分離レベルを使用することができます。

ドキュメント:https://technet.microsoft.com/en-us/library/ms189122(v=sql.105).aspx

+0

私はフィールド(+ @offset)をインクリメントしているので、あなたのソリューションが私の場合には動作しないcol2の値を見つけるためにループを使用しています。 – shaadi

+0

コミットする前にwhileループの完全な結果を表示したい – shaadi

+0

ローカル変数はトランザクションの一部ではないため、値は影響を受けません。ループの後で、コミットする前にいつでも 'SELECT'を出すことができます。 – Pred

0

あなたはそれはあなたがそのループがうまく実行されるため、いくつかのブロッキングが起こってきているように、それは私に聞こえる終了したことがないと言っている場合。

https://www.mssqltips.com/sqlservertip/2429/how-to-identify-blocking-in-sql-server/

私は非常にだけでなく、このためにアダムMachanicのsp_WhoIsActiveを使用してお勧めします。(トランス名前で)BEGIN TRAN innerを作成しながら、http://sqlblog.com/blogs/adam_machanic/archive/2016/10/18/sp-whoisactive-the-big-fixes.aspx

0

あなたはBEGIN TRAN外(一般)、および内部ループを作成する必要があります。 ループ内で、この反復のためにのみロールバックする条件がある場合は、SAVE TRANセーブポイントを使用して以前のトランスを失うことはありません。

declare @num int 
set @num = 0 

--drop table #test 
create table #test (
    valor Varchar(100) 
) 
begin tran 
while @num <= 5 
begin 
    begin transaction tran_inner 
    insert into #test (valor) values ('INSERT 1 INNER -> ' + convert(varchar(10),@num)) 
    save transaction sv_inner 
     insert into #test (valor) values ('INSERT 2 EVEN - SAVEPOINT -> ' + convert(varchar(10),@num)) 
     if @num % 2 = 0 begin 
      commit transaction sv_inner 
     end else begin 
      rollback transaction sv_inner 
     end 
    insert into #test (valor) values ('INSERT 3 INNER -> ' + convert(varchar(10),@num)) 
    set @num = @num + 1 
    if @@trancount > 0 begin 
     commit transaction tran_inner 
    end 
end 
select valor from #test; 
if @@trancount > 0 begin 
    commit tran 
end 

戻り行::私は「

は条件付きの挿入とロールバックセーブポイントとしながら、ループ内のサンプルのテストを作成しました1、2反復でも、そして3

img returns tsql

関連する問題