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