将数据类型varchar转换为实数时出错

时间:2019-09-21 16:00:45

标签: sql sql-server tsql

我构建了一个INSTEAD OF触发器,该触发器应该在尝试插入包含2个表的产品视图时启动:Approved_ProductsProducts

我的意思是重新路由插入并将数据插入到Approved_Products表中。

插入的数据来自一个CURSOR,它保存了我尝试插入的元组中的数据。

代码如下:

CREATE TABLE Product_Approval
(
    Product_ID  VARCHAR(100) NOT NULL PRIMARY KEY,
    Type        VARCHAR(100) NOT NULL,
    Price       REAL NOT NULL,
    Name        VARCHAR(100) NOT NULL,
    Supplier_ID VARCHAR(100) NOT NULL 
         FOREIGN KEY REFERENCES SUPPLIERS(Supplier_ID),
    CONSTRAINT Ck_Price CHECK (Price > 0)
)

CREATE VIEW vw_ProductList 
AS
    SELECT Product_ID, Type, Name, Price, Supplier_ID, 'Approved' Approval_Status
    FROM dbo.PRODUCTS
    UNION
    SELECT Product_ID, Type, Name, Price, Supplier_ID, 'Pending Approval' Approval_Status
    FROM dbo.Product_Approval 


SELECT * FROM VW_ProductList

CREATE TRIGGER ProductApprovals
ON VW_ProductList
INSTEAD OF INSERT
AS 
BEGIN
    SET NOCOUNT ON

    DECLARE 
        @Product_ID VARCHAR(100),
        @Type varchar(100),
        @Name VARCHAR(100),
        @Price REAL,
        @Supplier_ID VARCHAR(100)   

    DECLARE CCC CURSOR
            FOR (SELECT Product_ID, Type, Name, Price, Supplier_ID FROM INSERTED)

    OPEN CCC

    FETCH NEXT FROM CCC INTO @Product_ID, @Type, @Name, @Price, @Supplier_ID

    WHILE @@FETCH_STATUS = 0
    BEGIN   
        INSERT INTO Product_Approval 
        VALUES ('@Product_ID', '@Type', '@Name', @Price, '@Supplier_ID')
    END                 

    FETCH NEXT FROM CCC INTO @Product_ID, @Type, @Name, @Price, @Supplier_ID

    CLOSE CCC
    DEALLOCATE CCC
END

我尝试插入

INSERT INTO VW_ProductList(Product_ID , Type , Name , Price , Supplier_ID) 
VALUES ('0101010' , 'Whiskey' , 'Varmunollan'  , '90' , '00000')

但出现错误:

  

信息8114,第16级,状态5,过程产品批准,第76行
  将数据类型varchar转换为实数时出错。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

应该避免插入数据而不显式列出列。您的错误是确切的原因。

INSERT INTO Product_Approval 
VALUES ('@Product_ID', '@Type', '@Name', @Price, '@Supplier_ID')

表中列的顺序与INSERT语句中的顺序不同。

相关问题