【问题标题】:Alternative to cursor pivot split function?光标枢轴拆分功能的替代方案?
【发布时间】: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


    【解决方案1】:

    免责声明:我是项目的所有者Eval SQL.NET

    此解决方案允许在大约 2-3 秒内拆分和旋转 100k 行。 Eval SQL.NET 允许在 T-SQL 中执行 C# 代码。

    -- CREATE a big string with all the rows (100,000 rows)
    DECLARE @s VARCHAR(MAX) = ''
    SET @s = ( SELECT TOP ( 100000 )
                        RawSingleLine + CHAR(13) + CHAR(10)
               FROM     Import
    FOR XML PATH('') ,
            TYPE
             ).value('text()[1]', 'varchar(max)')
    
    -- Use C# Syntax to split the text. Use Regex.Split if necessary.
    DECLARE @sqlnet SQLNET = SQLNET::New('
    var rows = s.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
    return rows.Select(x => x.Split('' '')).ToList()
    ').ValueString('s', @s).AutoDispose()
    
    EXEC dbo.SQLNET_EvalResultSet @sqlnet
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多