更改数据类型并加载到SQL Server中的不同表中

时间:2016-06-14 19:30:26

标签: sql sql-server ssis

我有一个大的分隔平面文件,有170列。我已使用导入/导出向导将此平面文件加载到SQL Server中。

加载此平面文件时,所有列都存储为varchar数据类型。我需要将其中许多列转换为不同的数据类型,例如datebigintdecimalsmallint等,并且需要将这些列加载到不同的表中。

我是否需要使用SSIS包,还是可以在SQL Server中执行此操作?

有人可以建议一个好的程序吗?

我非常感谢您宝贵的时间和帮助。

2 个答案:

答案 0 :(得分:1)

你可以在t-sql和通过SSIS,t-sql,c#等进行ETL的人这样做。我会说这个任务在SSIS上的t-sql中是首选!在SSIS中,您必须为所有170列创建数据转换,并在源和目标上指定类型.....

您是否已经知道列所需的数据类型?如果是这样,你已经建立了表格,那么它就变得更容易了。只需编写一个非常长的插入语句,其中包含原始表中的select和select CASTCONVERTvarchar所需的数据类型。转换是棘手的部分,因为如果转换失败,插入将失败对列中的数据执行操作。您可以使用sys.columns和sys.types动态执行此操作,这样您就不会有几十次不同的列......

如果您不想编写所有数据类型等,这应该可以让您入门....仍然需要工作,但需要指南。

;WITH cteColumns AS (
    SELECT
       ColumnName = c.name
       ,DataType = CASE
          WHEN ty.name LIKE '%CHAR%' THEN ty.Name + '(' + CAST(c.max_length AS VARCHAR(10)) + ')'
          WHEN ty.name IN ('DECIMAL','NUMERIC') THEN ty.name + '(' + CAST(c.precision AS VARCHAR(10)) + ',' + CAST(c.scale AS VARCHAR(10)) + ')'
          ELSE ty.name
       END
    FROM
       sys.columns c
       INNER JOIN sys.types ty
       ON c.system_type_id = ty.system_type_id
    WHERE
       c.object_id = OBJECT_ID('TableName')
)

SELECT
    ColumnName + ' = CAST(source.' + ColumnName + ' AS ' + DataType + ')'
FROM
    cteColumns

答案 1 :(得分:0)

如果您需要定期导入

编写导入脚本,这将是一次性编写工作,您可以定期使用它并自动执行该过程。编写导入脚本的不同方法:请点击链接

here

您已使用导入/导出向导导入文件,问题在于数据类型转换,这是我的工作。 我创建一个具有正确数据类型的表并从导入的表中插入到创建的表中,User主要面临整数转换为float数据类型的问题,

使用STR

 LTRIM(RTRIM(STR(column_In_float,15))) as column_In_INT

- 像VARCHAR / CHAR / DATE / DDATETIME / NUMERIC等其他转换应该非常简单。