我有一个大的分隔平面文件,有170列。我已使用导入/导出向导将此平面文件加载到SQL Server中。
加载此平面文件时,所有列都存储为varchar
数据类型。我需要将其中许多列转换为不同的数据类型,例如date
,bigint
,decimal
,smallint
等,并且需要将这些列加载到不同的表中。
我是否需要使用SSIS包,还是可以在SQL Server中执行此操作?
有人可以建议一个好的程序吗?
我非常感谢您宝贵的时间和帮助。
答案 0 :(得分:1)
你可以在t-sql和通过SSIS,t-sql,c#等进行ETL的人这样做。我会说这个任务在SSIS上的t-sql中是首选!在SSIS中,您必须为所有170列创建数据转换,并在源和目标上指定类型.....
您是否已经知道列所需的数据类型?如果是这样,你已经建立了表格,那么它就变得更容易了。只需编写一个非常长的插入语句,其中包含原始表中的select和select CAST
或CONVERT
中varchar
所需的数据类型。转换是棘手的部分,因为如果转换失败,插入将失败对列中的数据执行操作。您可以使用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)