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 loop
或declaration 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 的双倍同时事务处理的主要内容,如果未能解决你的问题,请参考以下文章