create table #Raw (ID int identity primary key,RawData varchar(100))insert into #Raw (rawdata)select parsedfrom common.dbo.stringparserxml('"S9000+" "UV+ 131.0000+ 0.0000" "UV+ 132.0000+ 0.0000" "UV+ 140.0000+ 0.0000" "UV+ 141.0000+ 0.0000" "UV+ 142.0000+ 0.0000" "UVN+ 524.0000+ 0.0000" "UVN+ 525.0000+ 0.0000" "UVN+ 527.0000+ 0.0000" "UVN+ 528.0000+ 0.0000"TLOV+2044.0000+ 0.0000" "TLOV+2045.0000+ 0.0000" "TLOV+2046.0000+ 0.0000" "TLOV+2047.0000+ 0.0000" "TLOV+2048.0000+ 0.0000" "TLOV+2049.0000+ 0.0000" "OTLWV+2201.0000+ 0.0000" "OTLWV+2202.0000+ 0.0000" "OTD/ROV+2401.0000+ 0.0000" "OTD/ROV+2402.0000+ 0.0000" "OTD/ROV+2403.0000+ 0.0000" "OTD/ROV+2404.0000+ 0.0000" ""OTD/ROV+2432.0000+ 0.0000" "OTD/ROV+2436.0000+ 0.0000" "OTD/ROV+2443.0000+ 0.0000" "OTD/ROV+2444.0000+ 0.0000" "OTD/ROV+2445.0000+ 0.0000" "OTD/ROV+2446.0000+ 0.0000" "G59WO+5324.0000+ 36.6190" "TLMLV+5601.0000+ 0.0000" "TLMLV+5602.0000+ 20.0000" "TLMLV+5603.0000+ 0.0000" "TLMLV+5605.0000+ 0.0000" "TLMLV+5606.0000+ 75.0000" "TLMLV+5607.0000+ 175.0000"','')update #rawset rawdata = ltrim(rtrim(replace(rawdata, '"', '')))set statistics io onset statistics time on;with CTE (ID, Row, Parsed) as (select id, row, parsed from #raw cross apply common.dbo.StringParserXML(rawdata, '+'))select id, (select parsed from CTE col1 where row = 1 and id = cte.id), (select parsed from CTE col2 where row = 2 and id = cte.id), (select parsed from CTE col2 where row = 3 and id = cte.id)from CTEorder by id
create database Commongouse Commongocreate function [dbo].[StringParserXML](@String_in varchar(max),@Delimiter_in char(10))returns @Parsed table (Row int,Parsed varchar(100))as-- This one is faster than Numbers table, but it doesn't correctly handle-- XML-specific characters, such as "<" or "&". Numbers table version will handle those-- without difficulty.begin if right(@string_in, 1) = @delimiter_in select @string_in = left(@string_in, len(@string_in) - 1) declare @XML xml select @xml = ' ' insert into @parsed(row, parsed) select row_number() over (order by x.i.value('.', 'varchar(100)')), x.i.value('.', 'varchar(100)') from @xml.nodes('//i') x(i)returnend
SELECT LEFT(raw_payload, CHARINDEX('+', raw_payload, 1)-1), CASE WHEN LEN(raw_payload)-LEN(REPLACE(raw_payload,'+','')) >= 2 THEN CAST(SUBSTRING(raw_payload, CHARINDEX('+', raw_payload, 1) + 1, CHARINDEX('+', raw_payload, CHARINDEX('+', raw_payload, 1) +1) - (CHARINDEX('+', raw_payload, 1) + 1)) AS FLOAT) ELSE NULL END, CASE WHEN LEN(raw_payload)-LEN(REPLACE(raw_payload,'+','')) >= 3 THEN CAST(SUBSTRING(raw_payload, CHARINDEX('+', raw_payload, CHARINDEX('+', raw_payload, 1) +1) + 1, LEN(raw_payload) - CHARINDEX('+', raw_payload, CHARINDEX('+', raw_payload, 1) +1) + 1) AS FLOAT) ELSE NULL ENDFROM #SplitMe