【问题标题】:"Error converting data type varchar to float" message in SQL Server 2008SQL Server 2008 中的“将数据类型 varchar 转换为浮点数时出错”消息
【发布时间】:2014-06-12 09:07:55
【问题描述】:

我得到了一个脚本,它将一个表的内容(从沙箱)复制到另一个表(暂存)中,但我不断收到“将数据类型 varchar 转换为浮点数时出错”消息。

代码如下:

INSERT INTO First_DB.Orig_Table
(CustomerNo, AccountGroupID, ComCode)

SELECT A.CustomerNo, A.AccountGroupID, A.ComCode
FROM Test_DB.DBO.viewCMMasterData A
WHERE NOT EXISTS(SELECT B.CustomerNo
                 FROM First_DB.Orig_Table B
                 WHERE B.CustomerNo = A.CustomerNo)

Test_DB.DBO.viewCMMasterData 位于 Views 文件夹下,并与名为 dbo.cmMasterData 的表绑定> 它也位于 Test_DB 数据库中。

关于数据类型,

First_DB.Orig_Table

CustomerNo (PK, varchar(10), not null)
AccountGroupID (int, null)
ComCode (varchar(4), null)

Test_DB.DBO.viewCMMasterData

CustomerNo (nvarchar(255), null)
AccountGroupID (smallint, not null)
ComCode (varchar(4), not null)

我尝试使用 CAST() 但无济于事。

如果我还需要提供更多详细信息,请告诉我。

【问题讨论】:

  • 尝试在您的选择中分别运行这两个查询。它们运行正确吗?
  • 第一个工作正常,但在第二个 SELECT 语句中,我将 A.CustomerNo 替换为实际值,它也有效(但结果为空)。

标签: sql-server sql-server-2008


【解决方案1】:

你们两个表的 CustomerNo 的数据类型不同,我认为 viewCMMasterData 表中的浮点值没有转换为 varchar 格式,即使你转换它也会给出相同的错误。

找出非文本值的值,即数值。转换或转换的原因仅在您的数据适当时适用。

请使用 cast as ,同时给出宽度。这个问题也是因为宽度。数据可能会被截断。

INSERT INTO First_DB.Orig_Table
(CustomerNo, AccountGroupID, ComCode)

SELECT cast ( A.CustomerNo as varchar(10) ) , A.AccountGroupID, A.ComCode
FROM Test_DB.DBO.viewCMMasterData A
WHERE NOT EXISTS(SELECT B.CustomerNo
                 FROM First_DB.Orig_Table B
                 WHERE B.CustomerNo = A.CustomerNo)

我以本地身份进行测试,它对我有用。

declare @t table (customerno nvarchar(255), AccountGroupID smallint, ComCode varchar(4))
declare @t1 table (customerno varchar(10), AccountGroupID int, ComCode varchar(4))

insert into @t values ('abc',1,'a'),('120.33',2,'a'),('xna',1,'a')
insert into @t1 values ('abc',1,'a')

select * from @t
select * from @t1

insert into @t1 
select * from @t a
WHERE NOT EXISTS (SELECT B.CustomerNo
                 FROM @t1 B
                 WHERE B.CustomerNo = A.CustomerNo)

select * from @t
select * from @t1

insert into @t values ('123456.6',1,'a')--,('12345678910.35466',1,'a') --if remove this comment, then gives below error.

insert into @t1 
select * from @t a
WHERE NOT EXISTS (SELECT B.CustomerNo
                 FROM @t1 B
                 WHERE B.CustomerNo = A.CustomerNo)
-- the above statement give me error as, other wise everything transfer
"String or binary data would be truncated."

select * from @t
select * from @t1

【讨论】:

  • 既然一列是varchar,另一列是nvarchar,为什么还要转换成浮点数?
  • 因为您在 viewCMMasterData 表的 Customer No 列中有任何浮点值。 Nvarchar 是给定的,可能是因为它接受 varchar 中没有的 unicode 值。
  • 所以您是说存储在varchar 列中的值“123.55”被视为float
  • 只是补充一下,我将数据从 excel 文件导入到 Test_DB 并且 CustomerNo 列是数字。有什么问题?
  • 您确定中的列类型是varchar吗?阅读此内容以查看故障排除部分中提到的案例是否可能发生在您的案例中:support.microsoft.com/kb/321686
【解决方案2】:

令人惊讶的是,我让脚本进行了一些细微的调整。我没有使用 A.CustomerNo,而是使用实际值进行比较。这是我的代码:

INSERT INTO CCBP_PhaseII.customer.CM_MRWrkFieldsForMtnc
(CustomerNo, AccountGroupID, ComCode)
SELECT CAST(A.CustomerNo as INT), A.AccountGroupID, A.ComCode
FROM TEST_C1MDM_DB.DBO.viewCMMasterData A
WHERE NOT EXISTS(SELECT B.CustomerNo
                 FROM CCBP_PhaseII.customer.CM_MRWrkFieldsForMtnc B
                 WHERE B.CustomerNo = '503744242')

我知道这不是解决此问题的有效方法,尤其是当您将多个记录从一个表传输到另一个表时。我希望你能给我更多的建议来改进这个解决方案。感谢所有回复的人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 2011-11-30
    • 2017-03-23
    • 2017-03-15
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多