嗨,我对sql server有一个疑问。当目标数据类型不同时,如何将数据从一个表加载到另一个表。我希望将emplatlng值加载到destemplatlng表中。在这里,目标表lat和lng列的数据类型是decimal,但在emplatlng表中的数据类型是varchar。
table : [emplatlng]
CREATE TABLE [dbo].[emplatlng](
[pn_] [varchar](80) NULL,
[lat] [varchar](50) NULL,
[lng] [varchar](50) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[emplatlng] ([pn_], [lat], [lng]) VALUES (N'1', N'47.6864739', N' -117.416422
')
GO
INSERT [dbo].[emplatlng] ([pn_], [lat], [lng]) VALUES (N'2', N'47.6665465', N' -117.4166991
')
GO
INSERT [dbo].[emplatlng] ([pn_], [lat], [lng]) VALUES (N'3', N'47.629512', N' -117.241304
')
GO
INSERT [dbo].[emplatlng] ([pn_], [lat], [lng]) VALUES (N'5', N'47.6823378', N' -117.436788
')
GO
INSERT [dbo].[emplatlng] ([pn_], [lat], [lng]) VALUES (N'7', N'47.644277', N' -117.348362
')
GO
INSERT [dbo].[emplatlng] ([pn_], [lat], [lng]) VALUES (N'8', N'47.62510349999999', N' -117.5018943
')
GO
INSERT [dbo].[emplatlng] ([pn_], [lat], [lng]) VALUES (N'10', N'47.6564638', N' -117.4110428
')
GO
INSERT [dbo].[emplatlng] ([pn_], [lat], [lng]) VALUES (N'19', N'47.6693919', N' -117.4218557
')
GO
INSERT [dbo].[emplatlng] ([pn_], [lat], [lng]) VALUES (N'56', N'48.4249897', N' -119.5020331
')
GO
INSERT [dbo].[emplatlng] ([pn_], [lat], [lng]) VALUES (N'32', N'48.4249778', N' -119.5020466
')
GO
destination table :
CREATE TABLE [dbo].[destemplatlng](
[pn_] [varchar](80) NULL,
[lat] [decimal](9, 6) NULL,
[lng] [decimal](9, 6) NULL
)
我像咆哮着说:
insert into destemplatlng
select pn_,convert( decimal(9,6),lat), convert( decimal(9,6),lng) from emplatlng
它得到的错误如下:消息8114,级别16,状态5,行1将数据类型varchar转换为numeric时出错。
请告诉我如何在sql server中编写查询来完成此任务。
发布于 2018-02-15 17:05:23
问题是有几件事。就像@sepupic所说的,你的规模和准确性与你提供的数据是错误的。decimal(9,6)
最多只能存储6位小数,但是,有些数字的小数位数超过了6位(例如,-117.5018943
有7位)。
此外,您的数字以空格开头,并以列[lng]
的换行结束。数字没有这些字符。你需要把它们去掉。这似乎适用于我们拥有的样本数据(注意,由于数据类型更改,我必须重新创建目标表):
CREATE TABLE [dbo].[destemplatlng]([pn_] [varchar](80) NULL,
[lat] decimal(15,12) NULL,
[lng] decimal(15,12) NULL);
GO
INSERT INTO destemplatlng
SELECT pn_,
CONVERT(decimal(15,12),lat),
CONVERT(decimal(15,12),REPLACE(REPLACE(REPLACE(lng,N' ',N''),NCHAR(10),N''), NCHAR(13),N''))
FROM emplatlng;
从中可以学到的显而易见的一点是,首先要以正确的数据类型存储数据。不要将其他数据类型存储为varchars;这只会导致更多的问题,它会“解决”这些问题。
https://stackoverflow.com/questions/48803004
复制相似问题