ALTER PROCEDURE [dbo].[InsertNewProduct]
@ProductCode VARCHAR(200) ,
@OMCode VARCHAR(200) ,
@ProductName VARCHAR(200) ,
@Category VARCHAR(200) ,
@Balance INT ,
@ReOrder INT ,
@Unit VARCHAR(20) ,
@location VARCHAR(500) ,
@expiry DATE
AS
SET NOCOUNT ON
DECLARE @existingProduct INT
SET @existingProduct = ( SELECT COUNT(*)
FROM dbo.Products
WHERE OMCode = @OMCode
)
IF @existingProduct > 0
BEGIN
RAISERROR(' Already Exists--',11,1)
END
IF @existingProduct <= 0
BEGIN
INSERT INTO dbo.Products
VALUES ( @ProductCode, @OMCode, @ProductName, @Category, @Balance,
@ReOrder, @Unit, @location, @expiry )
END
GO
现在的问题是现有的OMCODE仍然插入了产品。 似乎无法解释为什么......我不想在OMCode列上放置一个UNIQUE CONSTRAINT。
答案 0 :(得分:1)
这可能与并发有关吗?我发现你没有在你的SP中做任何锁定。如果SP“同时”执行两次,则两次执行都可以输入相同的IF existingProduct&lt; = 0,您是否尝试锁定?
快速介绍,如果它有用:http://www.sqlteam.com/article/introduction-to-locking-in-sql-server
答案 1 :(得分:0)
因为你正在修改输入上的@OMCode,你可能想试试这个:
SET @existingProduct = ( SELECT COUNT(*)
FROM dbo.Products
WHERE rtrim(ltrim(OMCode)) = @OMCode
)
答案 2 :(得分:0)
您可以尝试只访问一次数据库,例如:
ALTER PROCEDURE [dbo].[InsertNewProduct]
@ProductCode VARCHAR(200) ,
@OMCode VARCHAR(200) ,
@ProductName VARCHAR(200) ,
@Category VARCHAR(200) ,
@Balance INT ,
@ReOrder INT ,
@Unit VARCHAR(20) ,
@location VARCHAR(500) ,
@expiry DATE
AS
SET NOCOUNT ON
DECLARE @Output TABLE (OMCode VARCHAR(200))
INSERT INTO dbo.Products
OUTPUT INSERTED.OMCode INTO @Output
SELECT @ProductCode, @OMCode, @ProductName, @Category, @Balance, @ReOrder, @Unit, @location, @expiry
FROM (SELECT @OMCode AS OMCode) Tester
LEFT JOIN Products ON Tester.OMCode = Products.OMCode
WHERE Products.OMCode IS NULL
IF(EXISTS(SELECT * FROM [@Output]))
BEGIN
RAISERROR(' Already Exists--',11,1)
END
就个人而言,我喜欢明确命名INSERT
子句中的所有列,这样可以减少错位的可能性
...
INSERT INTO dbo.Products (ProductCode, OMCode, ProductName, Category, Balance, ReOrder, Unit, location, expiry)
OUTPUT INSERTED.OMCode INTO @Output
SELECT @ProductCode, @OMCode, @ProductName, @Category, @Balance, @ReOrder, @Unit, @location, @expiry
...