sql查询无法正常运行

时间:2013-07-30 18:38:13

标签: sql sql-server procedure

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。

3 个答案:

答案 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 
    ...
相关问题