PlanID SSNUM EFFDATE ACCTID
Cumb429 555555555 2019-01-01 39506
Cumb429 555555555 2019-01-01 31506
Cumb429 555555555 2021-01-20 31506
DECLARE @ROW_DELIMITER VARCHAR(10) = CHAR(13)
DECLARE @COL_DELIMITER VARCHAR(10) = CHAR(9)
DECLARE @OUTPUT VARCHAR(MAX)
DECLARE @INPUT VARCHAR(MAX) = 'PlanID SSNUM EFFDATE ACCTID
Cumb429 555555555 2019-01-01 39506
Cumb429 555555555 2019-01-01 31506
Cumb429 555555555 2021-01-20 31506
'
;WITH src AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) row_idx, TRIM([value]) [row]
FROM STRING_SPLIT(REPLACE(@INPUT, @ROW_DELIMITER+CHAR(10), @ROW_DELIMITER), @ROW_DELIMITER) tb
WHERE TRIM([value]) <> ''
), header AS
(
SELECT src.row_idx, ROW_NUMBER() OVER (PARTITION BY src.row_idx ORDER BY (SELECT 1)) col_idx, TRIM(c.[value]) [col]
FROM src
CROSS APPLY STRING_SPLIT(src.[row], @COL_DELIMITER) c
WHERE src.row_idx = 1
), content AS
(
SELECT src.row_idx, ROW_NUMBER() OVER (PARTITION BY src.row_idx ORDER BY (SELECT 1)) col_idx, TRIM(c.[value]) [col]
FROM src
CROSS APPLY STRING_SPLIT(src.[row], @COL_DELIMITER) c
WHERE src.row_idx > 1
), prep AS
(
SELECT row_idx, col_idx, [col], tmp.max_row_idx
FROM content
CROSS APPLY (SELECT MAX(row_idx) max_row_idx FROM content) tmp
GROUP BY row_idx, col_idx, [col], tmp.max_row_idx
), sql_list AS
(
SELECT c.row_idx, 'SELECT '''+STRING_AGG(c.[col]+''' '+h.[col], ', ''') WITHIN GROUP (ORDER BY c.col_idx)+ CASE WHEN c.row_idx = c.max_row_idx THEN '' ELSE ' UNION ALL ' END [sql]
FROM prep c INNER JOIN header h on c.col_idx = h.col_idx
GROUP BY c.row_idx, c.max_row_idx, CASE WHEN c.row_idx = c.max_row_idx THEN '' ELSE ' UNION ALL ' END
)
SELECT @OUTPUT = STRING_AGG([sql], CHAR(13)+CHAR(10)) WITHIN GROUP (ORDER BY row_idx)
from sql_list
EXEC(@OUTPUT)
CREATE OR ALTER FUNCTION dbo.Strip_Chars
(
@INPUT NVARCHAR(MAX),
@CHAR NVARCHAR(1) = ' ',
@TRIMATLAST BIT = 0
)
RETURNS varchar(MAX) AS
BEGIN
WHILE CHARINDEX(@CHAR+@CHAR, @INPUT) > 0
SET @INPUT = REPLACE(@INPUT, @CHAR+@CHAR, @CHAR)
IF @TRIMATLAST = 1
SET @INPUT = TRIM(@INPUT)
RETURN @INPUT
END
GO
DECLARE @ROW_DELIMITER VARCHAR(10) = CHAR(13)
DECLARE @COL_DELIMITER VARCHAR(10) = ' '
DECLARE @OUTPUT VARCHAR(MAX)
DECLARE @INPUT VARCHAR(MAX) = 'PlanID SSNUM EFFDATE ACCTID
Cumb429 555555555 2019-01-01 39506
Cumb429 555555555 2019-01-01 31506
Cumb429 555555555 2021-01-20 31506
'
;WITH src AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) row_idx, TRIM([value]) [row]
FROM STRING_SPLIT(REPLACE(dbo.Strip_Chars(@INPUT, DEFAULT, DEFAULT), @ROW_DELIMITER+CHAR(10), @ROW_DELIMITER), @ROW_DELIMITER) tb
WHERE TRIM([value]) <> ''
), header AS
(
SELECT src.row_idx, ROW_NUMBER() OVER (PARTITION BY src.row_idx ORDER BY (SELECT 1)) col_idx, TRIM(c.[value]) [col]
FROM src
CROSS APPLY STRING_SPLIT(src.[row], @COL_DELIMITER) c
WHERE src.row_idx = 1
), content AS
(
SELECT src.row_idx, ROW_NUMBER() OVER (PARTITION BY src.row_idx ORDER BY (SELECT 1)) col_idx, TRIM(c.[value]) [col]
FROM src
CROSS APPLY STRING_SPLIT(src.[row], @COL_DELIMITER) c
WHERE src.row_idx > 1
), prep AS
(
SELECT row_idx, col_idx, [col], tmp.max_row_idx
FROM content
CROSS APPLY (SELECT MAX(row_idx) max_row_idx FROM content) tmp
GROUP BY row_idx, col_idx, [col], tmp.max_row_idx
), sql_list AS
(
SELECT c.row_idx, 'SELECT '''+STRING_AGG(c.[col]+''' '+h.[col], ', ''') WITHIN GROUP (ORDER BY c.col_idx)+ CASE WHEN c.row_idx = c.max_row_idx THEN '' ELSE ' UNION ALL ' END [sql]
FROM prep c INNER JOIN header h on c.col_idx = h.col_idx
GROUP BY c.row_idx, c.max_row_idx, CASE WHEN c.row_idx = c.max_row_idx THEN '' ELSE ' UNION ALL ' END
)
SELECT @OUTPUT = STRING_AGG([sql], CHAR(13)+CHAR(10)) WITHIN GROUP (ORDER BY row_idx)
FROM sql_list
EXEC(@OUTPUT)
CREATE OR ALTER FUNCTION dbo.Strip_Chars
(
@INPUT NVARCHAR(MAX),
@CHAR NVARCHAR(1) = ' ',
@TRIMATLAST BIT = 0
)
RETURNS varchar(MAX) AS
BEGIN
WHILE CHARINDEX(@CHAR+@CHAR, @INPUT) > 0
SET @INPUT = REPLACE(@INPUT, @CHAR+@CHAR, @CHAR)
IF @TRIMATLAST = 1
SET @INPUT = TRIM(@INPUT)
RETURN @INPUT
END
GO
CREATE OR ALTER PROCEDURE dbo.ConverTextToTable
(
@INPUT VARCHAR(MAX),
@COL_DELIMITER VARCHAR(10) = ' ',
@DEBUGMODE BIT = 1
) AS
BEGIN
BEGIN TRY
DECLARE @ROW_DELIMITER VARCHAR(10) = CHAR(13)
DECLARE @OUTPUT VARCHAR(MAX)
DECLARE @tb AS TABLE
(
[value] VARCHAR(MAX)
)
IF @COL_DELIMITER = ' '
INSERT INTO @tb
SELECT * FROM
STRING_SPLIT(REPLACE(dbo.Strip_Chars(@INPUT, DEFAULT, DEFAULT), @ROW_DELIMITER+CHAR(10), @ROW_DELIMITER), @ROW_DELIMITER)
ELSE
INSERT INTO @tb
SELECT * FROM
STRING_SPLIT(REPLACE(@INPUT, @ROW_DELIMITER+CHAR(10), @ROW_DELIMITER), @ROW_DELIMITER)
;WITH src AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) row_idx, TRIM([value]) [row]
FROM @tb
WHERE TRIM([value]) <> ''
), header AS
(
SELECT src.row_idx, ROW_NUMBER() OVER (PARTITION BY src.row_idx ORDER BY (SELECT 1)) col_idx, TRIM(c.[value]) [col]
FROM src
CROSS APPLY STRING_SPLIT(src.[row], @COL_DELIMITER) c
WHERE src.row_idx = 1
), content AS
(
SELECT src.row_idx, ROW_NUMBER() OVER (PARTITION BY src.row_idx ORDER BY (SELECT 1)) col_idx, TRIM(c.[value]) [col]
FROM src
CROSS APPLY STRING_SPLIT(src.[row], @COL_DELIMITER) c
WHERE src.row_idx > 1
), prep AS
(
SELECT row_idx, col_idx, [col], tmp.max_row_idx
FROM content
CROSS APPLY (SELECT MAX(row_idx) max_row_idx FROM content) tmp
GROUP BY row_idx, col_idx, [col], tmp.max_row_idx
), sql_list AS
(
SELECT c.row_idx, 'SELECT '''+STRING_AGG(c.[col]+''' '+h.[col], ', ''') WITHIN GROUP (ORDER BY c.col_idx)+ CASE WHEN c.row_idx = c.max_row_idx THEN '' ELSE ' UNION ALL ' END [sql]
FROM prep c INNER JOIN header h on c.col_idx = h.col_idx
GROUP BY c.row_idx, c.max_row_idx, CASE WHEN c.row_idx = c.max_row_idx THEN '' ELSE ' UNION ALL ' END
)
SELECT @OUTPUT = STRING_AGG([sql], CHAR(13)+CHAR(10)) WITHIN GROUP (ORDER BY row_idx)
FROM sql_list
EXEC(@OUTPUT)
END TRY
BEGIN CATCH
IF @DEBUGMODE = 1
SELECT CONCAT('<<ERROR>>Error Number: ',ERROR_NUMBER(),CHAR(13)+CHAR(10),' Line Number: ',ERROR_LINE(),CHAR(13)+CHAR(10),' Error Message: ',ERROR_MESSAGE()) [value]
END CATCH
END
GO
DECLARE @COL_DELIMITER VARCHAR(10) = CHAR(9)
DECLARE @DEBUGMODE BIT = 1
DECLARE @INPUT VARCHAR(MAX) = 'PlanID SSNUM EFFDATE ACCTID
Cumb429 555555555 2019-01-01 39506
Cumb429 555555555 2019-01-01 31506
Cumb429 555555555 2021-01-20 31506
'
EXEC dbo.ConverTextToTable @INPUT, @COL_DELIMITER, @DEBUGMODE
DECLARE @COL_DELIMITER VARCHAR(10) = ' '
DECLARE @DEBUGMODE BIT = 1
DECLARE @INPUT VARCHAR(MAX) = 'PlanID SSNUM EFFDATE ACCTID
Cumb429 555555555 2019-01-01 39506
Cumb429 555555555 2019-01-01 31506
Cumb429 555555555 2021-01-20 31506'
EXEC dbo.ConverTextToTable @INPUT, @COL_DELIMITER, @DEBUGMODE
Have a question about something in this article? You can receive help directly from the article author. Sign up for a free trial to get started.
Comments (0)