我在表格插入时遇到数据转换错误而且感到困惑。我正在编写一个脚本来对合并前和合并后数据库的运费进行快速和谐的协调。我有两个通过导入CSV文件创建的数据库表。为了简化DBA的操作,CSV文件中的所有数据都将进入表中的varchar列 - recon脚本将根据需要处理转换/转换。客户端位于SQL Server 2008 R2上。
以下是相关表格的缩写定义:
CREATE TABLE [dbo].[NOCOMMIT_PROD](
[SORT_DELTA_TOTAL] [varchar](50) NULL,
[rec_type] [varchar](50) NULL,
[price_id] [varchar](50) NULL,
[quote_id] [varchar](50) NULL,
[shipto_org_id] [varchar](50) NULL,
...
[trace] [varchar](8000) NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[NOCOMMIT_TEST](
[SORT_DELTA_TOTAL] [varchar](50) NULL,
[rec_type] [varchar](50) NULL,
[price_id] [varchar](50) NULL,
[quote_id] [varchar](50) NULL,
[shipto_org_id] [varchar](50) NULL,
...
[trace] [varchar](8000) NULL
) ON [PRIMARY]
这是临时表定义和错误的插入/选择语句:
if OBJECT_ID('tempdb..#tmp1') is not null drop table #tmp1
create table #tmp1(
price_ID bigint
,quote_ID bigint
,shipTo_ID bigint
,product_ID bigint
,trmnl_ID bigint
,carrier_ID bigint
,test_freight_pricing_rt decimal(15,7)
,prod_freight_pricing_rt decimal(15,7)
,test_trace varchar(8000)
,prod_trace varchar(8000)
,test_carrierID_found bigint
,prod_carrierID_found bigint
,test_surcharge decimal(15,7)
,prod_surcharge decimal(15,7)
,test_xtra_surcharge decimal(15,7)
,prod_xtra_surcharge decimal(15,7)
,test_miles int
,prod_miles int
,test_rate decimal(15,7)
,prod_rate decimal(15,7)
,explanation varchar(400)
)
insert into #tmp1(
price_ID
,quote_ID
,shipTo_ID
,product_ID
,trmnl_ID
,carrier_ID
,test_freight_pricing_rt
,prod_freight_pricing_rt
,test_trace
,prod_trace
)
select
cast(p.price_ID as bigint)
,cast(p.quote_ID as bigint)
,cast(p.shipto_org_id as bigint)
,cast(q.product_id as bigint)
,cast(p.cust_term_relation_id as bigint)
,cast(p.carrier_org_ID as bigint)
,cast(t.freight as decimal(15,7))
,cast(p.freight as decimal(15,7))
,t.trace
,p.trace
from NOCOMMIT_PROD p
join NOCOMMIT_TEST t on p.price_id = t.price_id
join tbl_fuel_cost_quote q on q.quote_id = p.quote_id
join tbl_fuel_cust_price cp on cp.price_id = p.price_id
where p.price_id != 'NULL' and p.price_id <> -1
当我执行上述操作时,它返回“Msg 8114,Level 16,State 5,Line 54 将数据类型varchar转换为数字时出错。“。如果我注释掉prod_trace列的插入,它执行得很好。我对此感到困惑,因为prod_trace的源是NOCOMMIT_PROD.trace列(相同的大小和类型)我找不到源数据有什么问题。有人可以提供一些有关为什么在没有涉及数字时出现此错误的信息吗?
感谢您提供的任何帮助和见解!!
答案 0 :(得分:1)
是的,执行以下脚本:
DECLARE @t TABLE (col1 decimal(10,2));
INSERT INTO @t (col1) VALUES ('Hi');
您将收到以下错误消息:
Msg 8114,Level 16,State 5,Line 3转换数据类型varchar时出错 数字。
错误在于您的一个十进制列中的数据。
答案 1 :(得分:0)
事实证明,NOCOMMIT_TEST.price_id中存在空值。重构脚本之后,我重新尝试了这一点,当我将连接添加到NOCOMMIT_TEST而没有引用除price_id上的连接之外的任何NOCOMMIT_TEST列时,我再次收到错误。在最初的情况下让我感到困惑的是,当我引用p.trace(NOCOMMIT_PROD.trace)时,SQL Server仅抛出错误 - 这没有,并且仍然没有任何意义。但我知道现在的问题在哪里。谢谢你的帮助!