您好我在sql server中有一个疑问。 当目标数据类型不同时,如何将数据从一个表加载到sql server中的另一个表。 我想在[destemplatlng]表中加载emplatlng值。这里目标表lat和lng列数据类型是十进制,但在 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
它的错误如下: Msg 8114,Level 16,State 5,Line 1 将数据类型varchar转换为数字时出错。
请告诉我如何在sql server
中编写查询以执行此任务答案 0 :(得分:1)
问题是几件事。像@sepupic所说,你所提供的数据的规模和准确性是错误的。 decimal(9,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;它最终导致了更多问题,并且解决了这个问题。