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 @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 を設定したくありません。

4

3 に答える 3

0

データベースへの 1 回のトリップで試すことができます。次に例を示します。

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 
    ...
于 2013-07-31T04:37:21.653 に答える