【问题标题】:Error converting data type varchar to real将数据类型 varchar 转换为 real 时出错
【发布时间】:2019-09-23 18:14:34
【问题描述】:

我构建了一个 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,程序 ProductApprovals,第 76 行
将数据类型 varchar 转换为 real 时出错。

我做错了什么?

【问题讨论】:

  • 去掉变量名两边的单引号。
  • 与您的问题无关,但在这里使用光标毫无意义。您只需要INSERT INTO Product_Approval (Product_ID, Type, Name, Price, Supplier_ID) SELECT Product_ID, Type, Name, Price, Supplier_ID FROM INSERTEDreal 数据类型也不适合存储价格和处理金钱。这就是money 类型存在的原因。
  • 即使我想输入多于 1 个数据元组,它会起作用吗?我需要一个光标吗?
  • 旁注:我还强烈建议不要将REAL 用于任何与金钱相关的数据。该数据类型因舍入错误而臭名昭著-您应该真正使用DECIMAL(p,s),它没有任何这些问题.....
  • 是的,它会工作,不,你不需要光标。请编辑您的问题以显示您的代码处于当前状态,并删除引号。

标签: sql sql-server tsql


【解决方案1】:

应避免在未明确列出列的情况下插入数据。你的错误是确切的原因。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 2011-03-29
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多