2015-05-14 138 views
1

我有以下更新查询每晚运行,它将SQL空间数据库(GIS)中的GIS信息更新到另一个数据库(LIVE)。此更新在几个月内一直没有问题,并且突然间今天突然失效将数据类型从varchar转换为数字时出错

“将数据类型从varchar转换为数字时出错”。

update LIVE.dbo.PT001 
Set 
    LIVE.dbo.pt001.dlonglegal_1 = Left(GIS.dbo.parcel.quartersection,2), 
    LIVE.dbo.pt001.dlonglegal_2 = SUBSTRING(GIS.dbo.parcel.quartersection,3,CHARINDEX('-',GIS.dbo.parcel.quartersection+'-')-3), 
    LIVE.dbo.pt001.dlonglegal_3 = SUBSTRING(GIS.dbo.parcel.quartersection,CHARINDEX('-',GIS.dbo.parcel.quartersection+'-')+1,1), 
    LIVE.dbo.pt001.dlonglegal_4 = SUBSTRING(GIS.dbo.parcel.quartersection,CHARINDEX('-',GIS.dbo.parcel.quartersection+'-')+3,1), 
    LIVE.dbo.pt001.dlonglegal_5 = right(GIS.dbo.parcel.quartersection,1) 
From GIS.dbo.parcel inner Join 
LIVE.dbo.PT001 on GIS.dbo.parcel.roll = LIVE.dbo.pt001.dROLLNMBR 
where GIS.dbo.parcel.roll = LIVE.dbo.PT001.drollnmbr AND 
GIS.dbo.parcel.quartersection is not null 

的quartersection信息与以下格式存储在包裹表作为nvarchar的(30):

NW12-5-6E 

在目标表中,将被存储为CHAR(15)和作为如下:

dlonglegal_1 = NW 
dlonglegal_2 = 12 
dlonglegal_3 = 5 
dlonglegal_4 = 6 
dlonglegal_5 = E 

我已经试过将数字字段作为数字投射而没有成功。我很难理解为什么更新今天开始失败,因为很长一段时间没有对数据库结构进行更改。

+0

如果结构相同,那么它可能是数据,如果你有像'NW12-5-6E'那样会失败的东西。 – artm

+2

你在那里做了一个从varchar到numeric的隐式转换。我们不知道表结构,所以它只是猜测。它可能是dlonglegal专栏之一(那些looke像他们可以承受的那样正常化,但这是另一个话题)。或者它可能是连接谓词中的一个列。顺便说一句,为什么在这个查询中有一个where子句呢?返回的每一行都将始终符合该条件,因为内部连接完全相同。 –

+0

'roll'和'dROLLNMBR'有哪些类型?其中之一是数字和其他文字?如果是这样,服务器将不得不将一列的值转换为另一列以执行连接。这也意味着性能已经受到影响,因为此转换可能会阻止优化器在文本列上使用索引 –

回答

0

就像artm建议的那样,我认为最可能的情况是数据问题,但一切都是正确的。我分别为每个列运行更新,并为每个列运行。然后我运行了完整的查询并且完成没有问题。我不确定最终的问题是什么,但显然它似乎再次运作。我感谢你的意见。

相关问题