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

Sql 将数据类型varchar转换为实数时出错,sql,sql-server,tsql,Sql,Sql Server,Tsql,我构建了一个而不是触发器,当我尝试插入到由两个表组成的产品视图中时,该触发器应该启动:Approved\u products和products 我的要点是重新路由insert并将数据插入到Approved_Products表中 插入的数据来自一个游标,该游标保存我试图插入的元组中的数据 代码如下: CREATE TABLE Product_Approval ( Product_ID VARCHAR(100) NOT NULL PRIMARY KEY, Type V

我构建了一个
而不是
触发器,当我尝试插入到由两个表组成的产品视图中时,该触发器应该启动:
Approved\u products
products

我的要点是重新路由insert并将数据插入到
Approved_Products
表中

插入的数据来自一个游标,该游标保存我试图插入的元组中的数据

代码如下:

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')
但我有一个错误:

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


我做错了什么?

应该避免在没有明确列出列的情况下插入数据。你的错误就是原因

插入到产品批准中
值(“@Product\u ID”、“@Type”、“@Name”、“Price”、“Supplier\u ID”)

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

删除变量名称周围的单引号。与您的问题无关,但在此处使用光标没有意义。您只需将
插入产品批准(产品ID、类型、名称、价格、供应商ID)即可从插入的
中选择产品ID、类型、名称、价格、供应商ID。而且
real
数据类型不适合存储价格和处理货币。这就是为什么
money
type存在的原因。即使我想输入超过1个元组的数据,它也能工作吗?我需要光标吗?旁注:我还强烈建议不要对任何与金钱相关的数据使用
REAL
。该数据类型因舍入错误而臭名昭著-您应该真正使用
DECIMAL(p,s)
,它没有任何这些问题……是的,它可以工作,不,您不需要光标。请编辑您的问题以显示当前状态下的代码,并删除引号。