【问题标题】:Procedure executes repeatedly程序重复执行
【发布时间】:2022-01-22 03:16:57
【问题描述】:

使用 SQL Server 2019 (v15.0.2000.5) 和 SQL Server Management Studio 15.0.18390.0。

我有一个简单的存储过程:向表中添加值。

CREATE DATABASE productsdb;
GO

CREATE TABLE Products 
(
    Id INT PRIMARY KEY IDENTITY,
    ProductName NVARCHAR(30) NOT NULL,
    Manufacturer NVARCHAR(30) NOT NULL,
    Price MONEY NOT NULL,
    InStockAmount INT DEFAULT 0 NOT NULL
);

CREATE PROCEDURE AddProduct
    @name NVARCHAR(30),
    @manufacturer NVARCHAR(30),
    @price MONEY,
    @amount INT
AS
    INSERT INTO Products(ProductName, Manufacturer, Price, InStockAmount)
    VALUES (@name, @manufacturer, @price, @amount)

然后我执行程序:

EXEC AddProduct 'Galaxy C7', 'Samsung', 22000, 4

奇怪的魔法发生了:

(1 row affected)

(1 row affected)

(1 row affected)

... [32 times in total]

消息 217,级别 16,状态 1,过程 AddProduct,第 25 行 [批处理开始第 2 行]
最大存储过程、函数、触发器或视图 超出嵌套级别(限制 32)。

SELECT * FROM Products;的时候,真的有32份同一个产品:

id name manufacturer amount price
143 Galaxy C7 Samsung 4 22000,00
144 Galaxy C7 Samsung 5 22000,00
145 Galaxy C7 Samsung 5 22000,00
146 Galaxy C7 Samsung 5 22000,00
147 Galaxy C7 Samsung 5 22000,00
148 Galaxy C7 Samsung 5 22000,00
... ... ... ... ...

另外,我注意到这个数量不知何故从 4 变为 5。

任何想法可能是意外循环的问题?

【问题讨论】:

  • 听起来你没有为你的CREATE PROCEDUREEXEC AddProduct 分开你的批次,所以你自己执行了这个过程。
  • 它们没有一起编码在同一个文件中。但是你给了提示。我改变了程序,在其中添加了 BEGIN 和 END 指令。现在它工作正常。
  • 嵌套层数为 32 并非巧合,所以肯定是这样的。
  • BEGIN...END 不会开始/结束批处理,@VardoTernos。如果您不分开批次,添加它们将无济于事
  • 这是初学者的错误,但不是错字。 OP 发布了一个很好的答案,应该重新打开这个问题以便它可以被接受。

标签: sql sql-server tsql


【解决方案1】:

我没有分开批次。

在对程序进行编码后,我决定通过执行来测试它,但在同一批次中。这使得过程递归(EXEC 调用包含在过程中):

CREATE PROCEDURE AddProduct
    @name NVARCHAR(30),
    @manufacturer NVARCHAR(30),
    @price MONEY,
    @amount INT
AS
    INSERT INTO Products (ProductName, Manufacturer, Price, InStockAmount) 
    VALUES (@name, @manufacturer, @price, @amount);

-- Here I didn't separate the batches, which was a mistake

EXEC AddProduct 'Galaxy C7', 'Samsung', 22000, 4;

添加一个GO 语句,其中注释已修复问题。

【讨论】:

  • 挑剔:GO 不是 (T-SQL) 语句 - 它是 SSMS 使用的批处理分隔符(和其他一些 MS 工具)
  • 也只是默认设置,可以在设置中更改;通过将其更改为对您的同事进行“选择”,您可以获得的乐趣......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
  • 2014-05-29
  • 2010-10-01
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
相关资源
最近更新 更多