将Excel文件导入SQL Server - 数据类型

时间:2016-08-30 19:54:44

标签: sql-server excel

我从SQL Server获得了一些Excel数据,但我更新了SQL Server的脚本,所以我需要再次将Excel导入SQL Server。我使用任务 - 导入数据

有一些错误:

  

复制到[dbo]。[AA](错误)消息。错误0xc0202009:数据流   任务1:SSIS错误代码DTS_E_OLEDBERROR。 OLE DB错误   发生了。错误代码:0x80004005。 OLE DB记录可用。   来源:“Microsoft SQL Server Native Client 11.0”Hresult:0x80004005   说明:“日期格式无效”。 (SQL Server导入和导出   向导)

     

错误0xc020901c:数据流任务1:出现错误   目的地 - AA.Inputs [目的地输入] .Columns [时间]开启   目的地 - AA.Inputs [目的地输入]。列状态返回   是:“转换失败,因为数据值溢出了   指定的类型。“。(SQL Server导入和导出向导)

     

错误0xc0209029:数据流任务1:SSIS错误代码   DTS_E_INDUCEDTRANSFORMFAILUREONERROR。 “目的地 -   AA.Inputs [Destination Input]“失败,因为错误代码为0xC020907A   发生了,并且错误行处理“目的地 -   AA.Inputs [Destination Input]“指定错误失败。错误   发生在指定组件的指定对象上。那里   可能是此前发布的错误消息,其中包含更多相关信息   失败。 (SQL Server导入和导出向导)

     

错误0xc0047022:数据流任务1:SSIS错误代码   DTS_E_PROCESSINPUTFAILED。组件上的ProcessInput方法   “Destination - AA”(107)失败,错误代码为0xC0209029   处理输入“目的地输入”(120)。确定的组件   从ProcessInput方法返回错误。错误是特定的   到组件,但错误是致命的,将导致数据流   任务停止运行。在此之前可能会发布错误消息   有关失败的更多信息。 (SQL Server导入和   导出向导)

我不知道是否有人有任何建议。

因为Excel文件只有有限的数据类型,所以number是float类型。有许多数据类型与目标SQL Server表不匹配。

2 个答案:

答案 0 :(得分:1)

对于高性能和控制数据类型转换:

1)使用另存为将Excel保存为CSV文本文件。

2)使用以下脚本导入数据:

BULK
INSERT mytable
FROM 'path_to_csdv_file.csv'
WITH
(
  FIELDTERMINATOR = ';',
  ROWTERMINATOR = '\n'
)

您可以使用格式文件来描述数据 有关详细信息,请查看:

BULK INSERT

答案 1 :(得分:0)

听起来数据类型未对齐。我最简单的做法是使用导入向导来正确设置数据类型。

http://www.wiseowl.co.uk/blog/s231/schedule_data_import_in_sql_server_pt2.htm

正确设置数据类型后,请执行以下操作: 右键单击表格>脚本表格>创建至>新查询编辑器窗口。现在,只需将结果复制/粘贴到Excel。填写所有字段的所有数据类型。另外,这样做:

右键单击表>脚本表格>插入到>新查询编辑器窗口。

最终,你应该得到这样的东西。

CREATE TABLE [dbo].[Something]
 (
     [Date]    VARCHAR(MAX),
     Change    VARCHAR(MAX),
     Index_Code    VARCHAR(MAX),
     Price_Return_Level    VARCHAR(MAX)
)
  bulk insert dbo.GII_ICLstg
  from 'C:\your_path_to_file.txt'
  WITH
  (
  FIRSTROW = 2,
  FIELDTERMINATOR = ',',
  ROWTERMINATOR = '\n'
  )
  GO
  INSERT INTO dbo.Something
    SELECT
        [Date] = CASE WHEN ISDATE([Date])=1 THEN CAST([Date] AS DATETIME) ELSE NULL END,
        [Change],
        Index_Code,
        Price_Return_Level = CASE WHEN ISNUMERIC(Price_Return_Level) = 1 
    FROM dbo.Something

就我个人而言,我认为这是做这类事情的最简单方法。