【问题标题】:Insert from stored procedure completing but not inserting从存储过程插入完成但未插入
【发布时间】:2018-01-25 08:38:32
【问题描述】:

这段代码看起来对我有用,但实际上并没有。

ALTER PROC dbo.spInsertNewVendor
AS
BEGIN
        BEGIN TRY
            BEGIN TRAN
            INSERT INTO Vendors (VendorID, VendorName, Address, City, State, ZipCode, Active)
            VALUES (1002, 'Appleburg', '1472 Witch Hollow Way', 'Salt Lake City', 'Utah', 84115, 'TRUE')
            COMMIT TRAN
        END TRY
        BEGIN CATCH
            ROLLBACK TRAN
        END CATCH
END

EXEC dbo.spInsertNewVendor

我已经更改了存储过程,一切正常,但是当我执行该过程时,它并没有像我想要的那样插入任何行。我应该做些什么不同的事情吗?有什么我想念的吗?

更新:

Vendors
-VendorID(PK,int)
-VendorName(nvarchar)
-Address(nvarchar)
-City(nvarchar)
-State(nvarchar)
-ZipCode(int)
-Active(nvarchar)

【问题讨论】:

  • 能否提供 Vendors 表架构的详细信息?
  • 当然。我更新了问题
  • VendorID 是否设置为自动递增?如果是,那么您不能在插入语句中设置 VendorID,您只需插入没有 VendorID 的数据

标签: sql-server stored-procedures transactions insert try-catch


【解决方案1】:
 -- Vendor ID Is a Primary Key And You Cannot Insert Value In PK.  
      ALTER PROC dbo.spInsertNewVendor
        AS
        BEGIN
                BEGIN TRY
                    BEGIN TRAN
                    INSERT INTO Vendors ( VendorName, Address, City, State, ZipCode, Active)
                    VALUES ('Appleburg', '1472 Witch Hollow Way', 'Salt Lake City', 'Utah', 84115, 'TRUE')
                    COMMIT TRAN
                END TRY
                BEGIN CATCH
                    ROLLBACK TRAN
                END CATCH
        END
        GO
        EXEC dbo.spInsertNewVendor

【讨论】:

  • @shredded 您分配的 NVARCHAR 的长度是多少,如果为 1,则不允许插入数据。
【解决方案2】:

首先通过这个找出错误:

alter PROC dbo.spInsertNewVendor
AS
BEGIN
        BEGIN TRY
            BEGIN TRAN
            INSERT INTO Vendors (VendorID, VendorName, Address, City, State, ZipCode, Active)
            VALUES (1002, 'Appleburg', '1472 Witch Hollow Way', 'Salt Lake City', 'Utah', 84115, 'TRUE')
            COMMIT TRAN
        END TRY
        BEGIN CATCH
            ROLLBACK TRAN
            SELECT ERROR_MESSAGE() AS ErrorMessage;
        END CATCH
END

EXEC dbo.spInsertNewVendor

如果 vendorID 是 Identity 列,那么上面的代码会给你错误 试试这个

alter PROC dbo.spInsertNewVendor
AS
BEGIN
        BEGIN TRY
            BEGIN TRAN
            INSERT INTO Vendors ( VendorName, Address, City, State, ZipCode, Active)
            VALUES ( 'Appleburg', '1472 Witch Hollow Way', 'Salt Lake City', 'Utah', 84115, 'TRUE')
            COMMIT TRAN
        END TRY
        BEGIN CATCH
            ROLLBACK TRAN
            SELECT ERROR_MESSAGE() AS ErrorMessage;
        END CATCH
END

EXEC dbo.spInsertNewVendor

【讨论】:

    【解决方案3】:

    我在本地复制了您的完整 SQL 查询,它工作正常,更新表后您可能面临的唯一问题是您必须将 VendorID 列分配为自动增量和插入过程中的标识您正在提供 VendorID 的值。

    我建议你清理一下你的桌子,然后再尝试执行你的程序。

    这是我在本地系统上尝试过的: 我希望我的 Vendors 表的架构必须与您的相同。

    create table Vendors
    (VendorID int,
    VendorName nvarchar(100),
    Address nvarchar(100),
    City nvarchar(100),
    State nvarchar(100),
    ZipCode int,
    Active nvarchar(100)
    CONSTRAINT PK_Cendor PRIMARY KEY (VendorID))
    
    CREATE PROC dbo.spInsertNewVendor
    AS
    BEGIN
            BEGIN TRY
                BEGIN TRAN
                INSERT INTO Vendors (VendorID, VendorName, Address, City, State, ZipCode, Active)
                VALUES (1002, 'Appleburg', '1472 Witch Hollow Way', 'Salt Lake City', 'Utah', 84115, 'TRUE')
                COMMIT TRAN
            END TRY
            BEGIN CATCH
                ROLLBACK TRAN
            END CATCH
    END
    
    EXEC dbo.spInsertNewVendor
    

    输出:

    【讨论】:

      猜你喜欢
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多