【发布时间】:2016-02-03 00:16:16
【问题描述】:
所以我正在制作一个存储过程,其最终目标是动态 ETL 解决方案。我的公司处理很多第三方数据,很多时候我不知道数据的列数、数据类型、格式等......因此,我整理了一些动态的临时表sql 和批量插入语句将数据导入 SQL Server。目前,数据以制表符或管道分隔的单列 nvarchar 字段形式出现,每个 txt 或 csv 文件通常有超过 100k 行。上述 csv/txt 格式的示例如下:
RawSingleLine
9XX01 No Cancelled Inadvertent Approval 1/12/2015 432115.2 99
480X1 No Cancelled Pending Processing 1/7/2014 5060 27.5
我目前的解决方案是使用游标和下面的拆分函数循环遍历所有单行,拆分它们,旋转它们,然后插入我的一个动态临时表中。但是,我想避免使用游标,因为它们很昂贵,并且首选基于集合的操作。
CREATE FUNCTION [dbo].[udf_Split]
(
@String NVARCHAR(4000),
@Delimiter NCHAR(1)
)
RETURNS TABLE
AS
RETURN
(
WITH Split(stpos,endpos)
AS(
SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
UNION ALL
SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
FROM Split
WHERE endpos > 0
)
SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
FROM Split
)
有没有办法在没有光标的情况下实现我想要的?
【问题讨论】:
标签: sql-server sql-server-2012 etl