如何在sql server

时间:2018-02-15 08:38:51

标签: sql-server sql-server-2008

您好我在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

中编写查询以执行此任务

1 个答案:

答案 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;它最终导致了更多问题,并且解决了这个问题。