Sql 我只是想了想。如果需要,外部应用程序将显示空记录。选项2适合我,但对我来说太复杂了…我会尝试理解it@shole与UDF中的代码相同,XML解析器速度惊人。在5000行样本上,仅比计数分析慢13 ms。Tally不能滑入交叉应用,限制为8K字节。把交叉申请

Sql 我只是想了想。如果需要,外部应用程序将显示空记录。选项2适合我,但对我来说太复杂了…我会尝试理解it@shole与UDF中的代码相同,XML解析器速度惊人。在5000行样本上,仅比计数分析慢13 ms。Tally不能滑入交叉应用,限制为8K字节。把交叉申请,sql,sql-server,tsql,Sql,Sql Server,Tsql,我只是想了想。如果需要,外部应用程序将显示空记录。选项2适合我,但对我来说太复杂了…我会尝试理解it@shole与UDF中的代码相同,XML解析器速度惊人。在5000行样本上,仅比计数分析慢13 ms。Tally不能滑入交叉应用,限制为8K字节。把交叉申请当作一个子程序。干杯:)@shole只是想了想。如果需要,外部应用将显示空记录。 Declare @YourTable table (ID int,YourCol varchar(max)) Insert Into @YourTable val


我只是想了想。如果需要,外部应用程序将显示空记录。选项2适合我,但对我来说太复杂了…我会尝试理解it@shole与UDF中的代码相同,XML解析器速度惊人。在5000行样本上,仅比计数分析慢13 ms。Tally不能滑入交叉应用,限制为8K字节。把交叉申请当作一个子程序。干杯:)@shole只是想了想。如果需要,外部应用将显示空记录。
Declare @YourTable table (ID int,YourCol varchar(max))
Insert Into @YourTable values
(1,'Type=A-SRID=152-WOID=3')


Select A.ID
      ,Item  = left(B.RetVal,charindex('=',B.RetVal+'=')-1)
      ,Value = substring(B.RetVal,charindex('=',B.RetVal+'=')+1,len(B.RetVal))
 From  @YourTable A
 Cross Apply [dbo].[udf-Str-Parse](A.YourCol,'-') B
 --Where B.RetVal like 'SRID%'
Select A.ID
      ,Item  = left(B.RetVal,charindex('=',B.RetVal+'=')-1)
      ,Value = substring(B.RetVal,charindex('=',B.RetVal+'=')+1,len(B.RetVal))
 From  @YourTable A
 Cross Apply (
                Select RetSeq = Row_Number() over (Order By (Select null))
                      ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
                From  (Select x = Cast('<x>' + replace((Select replace(A.YourCol,'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
                Cross Apply x.nodes('x') AS B(i)
             ) B
  --Where B.RetVal like 'SRID%'
ID  Item    Value
1   Type    A
1   SRID    152
1   WOID    3
CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10))
Returns Table 
As
Return (  
    Select RetSeq = Row_Number() over (Order By (Select null))
          ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
    From  (Select x = Cast('<x>' + replace((Select replace(@String,@Delimiter,'§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
    Cross Apply x.nodes('x') AS B(i)
);
--Thanks Shnugo for making this XML safe
--Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',')
--Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ')
--Select * from [dbo].[udf-Str-Parse]('this,is,<test>,for,< & >',',')
--Performance On a 5,000 random sample -8K 77.8ms, -1M 79ms (+1.16), -- 91.66ms (+13.8)
declare @test varchar(max) = 'Type=A-SRID=152-WOID=3'
declare @test2 varchar(max) = 'SRID=152-WOID=3'
declare @test3 varchar(max) = 'Type=A-WOID=3'

select iif(charindex('SRID=', @test) > 0, substring(@test, charindex('SRID=', @test)+5, charindex('-',substring(@test, charindex('SRID=', @test)+5, 8000))-1),'')
select iif(charindex('SRID=', @test2) > 0, substring(@test2, charindex('SRID=', @test2)+5, charindex('-',substring(@test2, charindex('SRID=', @test2)+5, 8000))-1),'')
select iif(charindex('SRID=', @test3) > 0, substring(@test3, charindex('SRID=', @test3)+5, charindex('-',substring(@test3, charindex('SRID=', @test3)+5, 8000))-1),'')
select case when charindex('-',substring(@test, charindex('SRID=', @test)+5, 8000))-1 < 0
        then substring(@test, charindex('SRID=', @test)+5, 8000)
        else iif(charindex('SRID=', @test) > 0, substring(@test, charindex('SRID=', @test)+5, charindex('-',substring(@test, charindex('SRID=', @test)+5, 8000))-1),'')
        end