2017-07-26 119 views
1

如何在SQL Server中将while与while循环一起使用?如何在SQL Server中使用while循环使用BEGIN TRANSACTION?

此查询从未完成,也许是因为它停止并在插入一行后寻找COMMIT TRANSACTION(当@cnt = 1),但我不想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; 

所以,我怎么能检查结果犯,而循环之前?

+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 INTO .. OUTPUT构建输出INSERT语句的结果。

文档:https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql

批(使用第二连接)之外,你可以使用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

您应该创建一个BEGIN TRAN外(普通)和内循环,同时创建一个BEGIN TRAN inner(用反式名称)。 在内部循环中,如果仅用于此迭代的回滚条件,我使用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