SQL Server 2008 的双倍同时事务处理

Posted

技术标签:

【中文标题】SQL Server 2008 的双倍同时事务处理【英文标题】:Double While Transac SQL Server 2008 【发布时间】:2015-02-19 05:51:46 【问题描述】:

我在处理这个查询时遇到了一些问题。问题是只有一段时间是过程,第一个,不适合我。

这是我的代码: 虽然@j,不工作,但我没有看到错误......

感谢您的宝贵时间。

CREATE PROCEDURE InsertVar
AS

DECLARE @i int
DECLARE @j int

SET NOCOUNT ON;
SET @i = 1
SET @j = 1

    WHILE @j < 21
        BEGIN
            WHILE @i < 11
                BEGIN
                    INSERT INTO Var(idline,idVar,CheckBox ) 
                    VALUES(@j,@i,0); 
                    SET @i = @i + 1;
                END;
        SET @j = @j + 1;
    END;

SELECT * FROM Var;
GO

【问题讨论】:

不要这样做,你循环需要太多时间 【参考方案1】:

还有其他方法可以执行此逻辑(例如单个查询)。但是您的问题是您没有在循环内重新初始化 i 。试试这个:

CREATE PROCEDURE InsertVar
AS
BEGIN
    DECLARE @i int;
    DECLARE @j int;

    SET NOCOUNT ON;
    SET @j = 1;

    WHILE @j < 21
        BEGIN
            SET @i = 1;
            WHILE @i < 11
                BEGIN
                    INSERT INTO Var(idline, idVar, CheckBox) 
                        VALUES(@j, @i, 0); 
                    SET @i = @i + 1;
                END;
        SET @j = @j + 1;
    END;

    SELECT * FROM Var;
END;
GO

【讨论】:

@Mohit 在过程结束时设置 `NOCOUNT OFF` 毫无意义。退出 proc 无论如何都会重置它。【参考方案2】:

使用Recursive CTE 生成行。无需使用while loopdeclaration of varaiables

CREATE PROCEDURE Insertvar
AS
  BEGIN
      SET NOCOUNT ON;

        ;WITH cte
             AS (SELECT 1 AS idline
                 UNION ALL
                 SELECT idline + 1 FROM   cte
                 WHERE  idline < 20),
             cte1
             AS (SELECT idline,1 AS idVar,0 AS CheckBox
                 FROM   cte
                 UNION ALL
                 SELECT idline,idVar + 1,CheckBox FROM   cte1
                 WHERE  idVar < 10)
        INSERT INTO [Var]
        SELECT * FROM   cte1
        ORDER  BY idline,idVar 

      SELECT * FROM   [Var]
  END 

【讨论】:

以上是关于SQL Server 2008 的双倍同时事务处理的主要内容,如果未能解决你的问题,请参考以下文章

怎样读sql server 2008 事务日志

sql server 2008 的事务日志文件存储数据库的啥情况

SQL Server 2008 中的事务问题

SQL Server 2008截断事务日志

查看 SQL Server 2008 中的所有事务日志

为啥在事务范围内调用 SQL Server 2008 中的全文搜索失败?