2016-12-07 38 views

回答

1

使用解析/分割功能和CROSS的幫助應用

Declare @YourTable table (ID int,[Desc] varchar(500)) 
Insert Into @YourTable values 
(1,'Purched Order 12345 ||COXFF6||'), 
(2,'Purched Order 12345 ||COXFF6||,||COX888|| haha ||COX777||') 

Select ID 
     ,[Desc] = '||'+B.RetVal+'||' 
From @YourTable A 
Cross Apply (Select * 
       From [dbo].[udf-Str-Parse](Replace('.'+A.[Desc],' ','.'),'||') 
       Where RetVal not like '[.,]%' 
      ) B 

返回

ID Desc 
1 ||COXFF6|| 
2 ||COXFF6|| 
2 ||COX888|| 
2 ||COX777|| 

UDF如果需要。 (如果不能使用UDF,邏輯可以遷移到交叉應用中)

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(@String,@Delimiter,'</x><x>')+'</x>' as xml).query('.')) as A 
    Cross Apply x.nodes('x') AS B(i) 
); 
--Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',') 
--Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ') 
1

googlethe substring()charIndex()功能。

表達式charIndex('||', @desc)' will return the position of the first pair of pipes, so 2 + charIndex('||',@desc)'是你想要的第一個字符的位置(C),然後爲了得到長度,我們需要減去開始位置結束的位置。最終位置是第二對管子的charindex。使用charIndex函數的最後一個[可選]參數,該參數指定從何處開始查找。如果您將其設置爲第一對管道的位置,則charindex將查找下一對(第二對)的位置:charIndex('||', @desc, charIndex('||', @desc))。字符串提取的長度是它們之間的區別,(調整位)

declare @desc varchar(max) = 'Purchased Order ||COFX123412||' 
Select 2+charIndex('||', @desc), -- position of start of COFX123412 
    charIndex('||', @desc, charIndex('||', @desc)), -- pos of 2nd pair of pipes 
    2+charIndex('||', @desc))-2-charIndex('||', @desc), -- Length 

    substring(@desc, 2+charIndex('||', @desc), 
     charIndex('||', @desc, 2+charIndex('||', @desc))- 
         2-charIndex('||', @desc)) 
+0

請添加一些說明。 – DimaSan

相關問題