【问题标题】:SQL Server changes the value in the float column when converting to varcharSQL Server 在转换为 varchar 时更改了 float 列中的值
【发布时间】:2019-12-21 19:06:49
【问题描述】:

我的表中有一个float 类型的列。当我将电子表格 (Excel) 数据导入数据库时​​,该表是自动生成的。因此,我希望将一列从float 更改为varchar,但是当我尝试这样做时,出现错误:

'tblInvoices' 表
无法创建索引“IX_tblInvoices”。
CREATE UNIQUE INDEX 语句终止,因为为对象名称“dbo.tblInvoices”和索引名称“IX_tblInvoices”找到重复键。
重复键值为 (1.00001e+006)。声明已终止。

它是一个唯一的列,并以这种方式设置(出于某种原因未设置为主键)。我已经运行查询来搜索和删除重复字段,但没有。我运行的查询如下:

WITH CTE AS
(
   SELECT 
       Invoice,
       RN = ROW_NUMBER()OVER(PARTITION BY Invoice ORDER BY Invoice)
   FROM
       dbo.tblInvoices
)
DELETE FROM CTE 
WHERE RN > 1

所以Invoice 列中的值是 1000010,当我运行以下查询时,会找到一行。

SELECT * 
FROM [TradeReceivables_APR_IFRS9].[dbo].[tblInvoices] 
WHERE Invoice = 1.00001e+006

请注意,我在错误中搜索的值是 1.00001e+006,而不是 1000010。

所以我的问题是为什么 DBMS 会这样做?为什么它会这样改变价值?当我删除该列时,它会使用另一列等等(总共大约 40 000 行)。如何将列从 float 更改为 varchar 而不会更改数据并出现错误?

任何帮助将不胜感激!

【问题讨论】:

    标签: sql-server ssms sqldatatypes


    【解决方案1】:

    该字段似乎是一个整数,因此您可以先将其转换为BIGINT,然后再转换为VARCHAR

    Declare @Invoice as float = 1.00001e+006
    print cast(@Invoice as varchar) -->> Result : 1.00001e+006
    print cast(cast(@Invoice as bigint) as varchar) -->> Result : 1000010
    

    【讨论】:

    • 我在发布此内容后立即发现了这一点。但感谢您的回答。接受为答案!
    猜你喜欢
    • 1970-01-01
    • 2015-11-05
    • 2013-06-11
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    相关资源
    最近更新 更多