Итак, я создаю хранимую процедуру, конечной целью которой является динамическое решение ETL. Моя компания имеет дело с большим количеством сторонних данных, и часто я не знаю количества столбцов, типов данных, формата данных и т. д. Поэтому я собрал ряд временных таблиц с динамическими sql и операторы массовой вставки, чтобы получить данные в SQL Server. В настоящее время данные поступают в виде поля nvarchar с одним столбцом, разделенного табуляцией или вертикальной чертой, и часто в файле txt или csv содержится более 100 000 строк. Ниже приведен пример вышеупомянутого формата 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
)
Есть ли способ добиться того, чего я хочу, без курсора?