2016-08-12 108 views
0

我们不得不解析一些字符串与TSQL记号化的键值对SQL Server中的字符串

这是我想要来标记到键值对令牌

<parameters>SearchName="Flat " SearchFormTemplateId="Search" SearchFormInfo=":ID_.Modules.Business.SearchModule.Label.SearchType.RE.Residential:LDSBL_15 km%15,10 km%10,5 km%5,20 km%20:LSTG_3,2,4:DR_3572ad9b-44cb-4229-a512-3037562d7cc7" SubTypeGroupId="3,2,4" InterfaceLocation="3.5908783699254903"§ CountryId="446931c9-7efe-440d-b674-24b8659087a7" Month="2000" AdMaterialTransactionTypeId="RE"/><azmi/></parameters> 
<parameters>SearchName="Apartment and.. " CountryID="446931C9-7EFE-440D-B674-24B8659087A7" DefaultRegionID="446931C9-7EFE-440D-B674-24B8659087A7" CurrencyID="USD" LocationID="5A7FCB90-6247-44FD-AB2E-61FEABEA1246,AFAC41AE-0877-45E1-BAA6-1846E9D92332,CCB35927-94CE-4F41-B4BA-695A0396DC5A,B93B2C1F-460A-4726-8B51-FFBEFC15C810,4E701DB8-6B3B-4C0E-91FB-352BEF05FB40,9FA7B3DA-9D36-4742-8526-5143F01E6089,384AF508-D5DC-4ED1-93D2-635180447A8D,49B571CC-FC2E-40F0-A5A7-722D6D1F5926,B0CA4856-427B-4C93-A085-95FA36C082B8,3590075E-9A63-4AF5-BE88-9C8BB70BACB7,E1283086-8C38-4A97-B858-ABE5940F2986,78060DDC-3F00-4AF0-AD17-AC0007FE0622,FE815C24-94D5-4107-989D-B0F5FB5280E8,356F506E-09C1-4E1E-B54E-C54E80E502DF,F028F134-4C13-491B-846C-D85B4D979A5F,7E4013DB-2DE3-401B-9AFF-F41C16B12DB4,5C59BC43-63B7-45D5-8963-F916A71ED889,DA8D9F2D-1C43-443A-86C7-F9661FF06830" TransactionTypeID="RE" PropertySubTypeGroupID="1,2,3,4" MMAX="2100" MoMin="1500" NumberOfRoomsMin="3" InterfaceLocation="1"</parameters> 
<parameters>SearchName="Apartment" DefaultRegionID="446931c9-7efe-440d-b674-24b8659087a7" CurrencyID="USD" TransactionTypeID="SE" PropertySubTypeGroupID="4" MMIN="100000" SearchBy="ByLocality" InterfaceLocation="1" LocationID="09194e31-1b5e-482b-9775-41886a1d1167" /><Keyid="6f4037e2-69ba-402d-a8ac-286b04e2bf3b"</parameters> 
<parameters>SearchName="Location, 3 rooms" CurrencyID="USD" LocationID="f5812b35-e952-4e3e-a3f1-b0d678616826" TransactionTypeID="RE" PropertySubTypeGroupID="2,3" MMAX="2500" NumberOfRoomsMin="3" SurfaceLivibleMin="80" SearchBy="WithoutGeo" InterfaceLocation="2" /><Keyid="079bb71a-8f01-42fd-a956-0be2239be0ef"</parameters> 
<parameters>SearchName="Flat..." DefaultRegionID="446931c9-7efe-440d-b674-24b8659087a7" CurrencyID="USD" TransactionTypeID="RE" PropertySubTypeGroupID="1,2,3" MMAX="4050" MoMin="2700" NumberOfRoomsMin="4.0" SearchBy="ByLocality" InterfaceLocation="1" LocationID="e22c7349-fd77-407a-88a4-bd39a105b986" /><Keyid="44e05bf1-8a26-48b6-b12b-5a652d586d78"</parameters> 
<parameters>SearchName="Apartment -" DefaultRegionID="446931c9-7efe-440d-b674-24b8659087a7" CurrencyID="USD" TransactionTypeID="RE" PropertySubTypeGroupID="4" MoMin="500" SearchBy="ByLocality" InterfaceLocation="1" LocationID="e7148138-5be1-46c5-98b1-5ca2edeeb9da" /><Keyid="37ad0ed5-1800-417b-8e17-9ff5084086a2"</parameters> 
<parameters>SearchName="Rent dsfsd" CurrencyID="USD" TransactionTypeID="RE" PropertySubTypeGroupID="4" SearchBy="WithoutGeo" /><Keyid="d695f924-6ce6-405b-a561-fa3269f41221"</parameters> 
<parameters>SearchName="Apartement ..." DefaultRegionID="446931c9-7efe-440d-b674-24b8659087a7" CurrencyID="USD" AreaID="e90f1e83-ce84-46b6-826a-3775ffd2815d,dc2c2435-b773-424f-a279-4141efd21b78,ce142f26-2b08-419d-86a2-943bea72b279,b5749fe2-9360-48c0-8ffc-f6c9a343f2fa,a3a559c2-4c7e-4b4c-8314-335e9e655472,c3cd7728-3e6a-4787-959f-8e9e824b02d0" TransactionTypeID="RE" PropertySubTypeGroupID="3,2,4" MMAX="1500" LocationIdAgregate="" AreaIdAgregate="e90f1e83-ce84-46b6-826a-3775ffd2815d,dc2c2435-b773-424f-a279-4141efd21b78,ce142f26-2b08-419d-86a2-943bea72b279,b5749fe2-9360-48c0-8ffc-f6c9a343f2fa,a3a559c2-4c7e-4b4c-8314-335e9e655472,c3cd7728-3e6a-4787-959f-8e9e824b02d0" StateIdAgregate="1D6E6621-3179-4D54-A9D8-89E6F438FF3B,8C79C6B5-B61A-45F9-8560-91AE4825AC6A" InterfaceAreaIdAgregate="e90f1e83-ce84-46b6-826a-3775ffd2815d,dc2c2435-b773-424f-a279-4141efd21b78,ce142f26-2b08-419d-86a2-943bea72b279,b5749fe2-9360-48c0-8ffc-f6c9a343f2fa,a3a559c2-4c7e-4b4c-8314-335e9e655472,c3cd7728-3e6a-4787-959f-8e9e824b02d0" SearchBy="ByRegion" /><Keyid="37ad0ed5-1800-417b-8e17-9ff5084086a2"</parameters> 
<parameters>SearchName="Apartment a" DefaultRegionID="446931c9-7efe-440d-b674-24b8659087a7" CurrencyID="USD" AreaID="49401e55-95c1-42cb-9242-9468707e7d8a" TransactionTypeID="SE" PropertySubTypeGroupID="16" AreaIdAgregate="49401e55-95c1-42cb-9242-9468707e7d8a" StateIdAgregate="97F9F29F-149E-4E53-A470-96CC8499A64B" SearchBy="ByRegion" /><Keyid="39fb945c-b048-4942-be86-17f692539ba3"</parameters> 
<parameters>SearchName="Apartment, Location, 5 rooms" CountryID="446931C9-7EFE-440D-B674-24B8659087A7" DefaultRegionID="446931C9-7EFE-440D-B674-24B8659087A7" CurrencyID="USD" LocationID="E22C7349-FD77-407A-88A4-BD39A105B986" TransactionTypeID="RE" PropertySubTypeGroupID="1,2,3,4" NumberOfRoomsMin="5" InterfaceLocation="5"</parameters> 
<parameters>SearchName="Apartment" DefaultRegionID="446931c9-7efe-440d-b674-24b8659087a7" CurrencyID="USD" TransactionTypeID="SE" PropertySubTypeGroupID="16" SearchBy="ByLocality" InterfaceLocation="5" LocationID="184e17b3-9d27-46fd-8a19-a9f402dfe680" /><Keyid="39fb945c-b048-4942-be86-17f692539ba3"</parameters> 

字符串它是不是一个真正的XML 键和值都喜欢键=“值”

somethimes在最后有一些垃圾字符

对我来说野趣部分我s from searchname =“..” 下一个/>

与xml节点它doesesent工作既不与正则表达式 有任何建议吗?

感谢

+0

我觉得是不是/>。然后整个字符串可以包装在父元素中并作为xml加载。 –

+0

[你有什么试过](http://mattgemmell.com/2008/12/08/what-have-you-tried/)?你期望什么结果?什么版本的SQL Server? – HABO

+0

sql server 2014 – walpino

回答

0

也许这可以帮助

Declare @String varchar(max) =' 
<parameters>SearchName="Flat " SearchFormTemplateId="Search" SearchFormInfo=":ID_.Modules.Business.SearchModule.Label.SearchType.RE.Residential:LDSBL_15 km%15,10 km%10,5 km%5,20 km%20:LSTG_3,2,4:DR_3572ad9b-44cb-4229-a512-3037562d7cc7" SubTypeGroupId="3,2,4" InterfaceLocation="3.5908783699254903"§ CountryId="446931c9-7efe-440d-b674-24b8659087a7" Month="2000" AdMaterialTransactionTypeId="RE"/><azmi/></parameters> 
<parameters>SearchName="Apartment and.. " CountryID="446931C9-7EFE-440D-B674-24B8659087A7" DefaultRegionID="446931C9-7EFE-440D-B674-24B8659087A7" CurrencyID="USD" LocationID="5A7FCB90-6247-44FD-AB2E-61FEABEA1246,AFAC41AE-0877-45E1-BAA6-1846E9D92332,CCB35927-94CE-4F41-B4BA-695A0396DC5A,B93B2C1F-460A-4726-8B51-FFBEFC15C810,4E701DB8-6B3B-4C0E-91FB-352BEF05FB40,9FA7B3DA-9D36-4742-8526-5143F01E6089,384AF508-D5DC-4ED1-93D2-635180447A8D,49B571CC-FC2E-40F0-A5A7-722D6D1F5926,B0CA4856-427B-4C93-A085-95FA36C082B8,3590075E-9A63-4AF5-BE88-9C8BB70BACB7,E1283086-8C38-4A97-B858-ABE5940F2986,78060DDC-3F00-4AF0-AD17-AC0007FE0622,FE815C24-94D5-4107-989D-B0F5FB5280E8,356F506E-09C1-4E1E-B54E-C54E80E502DF,F028F134-4C13-491B-846C-D85B4D979A5F,7E4013DB-2DE3-401B-9AFF-F41C16B12DB4,5C59BC43-63B7-45D5-8963-F916A71ED889,DA8D9F2D-1C43-443A-86C7-F9661FF06830" TransactionTypeID="RE" PropertySubTypeGroupID="1,2,3,4" MMAX="2100" MoMin="1500" NumberOfRoomsMin="3" InterfaceLocation="1"</parameters> 
<parameters>SearchName="Apartment" DefaultRegionID="446931c9-7efe-440d-b674-24b8659087a7" CurrencyID="USD" TransactionTypeID="SE" PropertySubTypeGroupID="4" MMIN="100000" SearchBy="ByLocality" InterfaceLocation="1" LocationID="09194e31-1b5e-482b-9775-41886a1d1167" /><Keyid="6f4037e2-69ba-402d-a8ac-286b04e2bf3b"</parameters> 
<parameters>SearchName="Location, 3 rooms" CurrencyID="USD" LocationID="f5812b35-e952-4e3e-a3f1-b0d678616826" TransactionTypeID="RE" PropertySubTypeGroupID="2,3" MMAX="2500" NumberOfRoomsMin="3" SurfaceLivibleMin="80" SearchBy="WithoutGeo" InterfaceLocation="2" /><Keyid="079bb71a-8f01-42fd-a956-0be2239be0ef"</parameters> 
<parameters>SearchName="Flat..." DefaultRegionID="446931c9-7efe-440d-b674-24b8659087a7" CurrencyID="USD" TransactionTypeID="RE" PropertySubTypeGroupID="1,2,3" MMAX="4050" MoMin="2700" NumberOfRoomsMin="4.0" SearchBy="ByLocality" InterfaceLocation="1" LocationID="e22c7349-fd77-407a-88a4-bd39a105b986" /><Keyid="44e05bf1-8a26-48b6-b12b-5a652d586d78"</parameters> 
<parameters>SearchName="Apartment -" DefaultRegionID="446931c9-7efe-440d-b674-24b8659087a7" CurrencyID="USD" TransactionTypeID="RE" PropertySubTypeGroupID="4" MoMin="500" SearchBy="ByLocality" InterfaceLocation="1" LocationID="e7148138-5be1-46c5-98b1-5ca2edeeb9da" /><Keyid="37ad0ed5-1800-417b-8e17-9ff5084086a2"</parameters> 
<parameters>SearchName="Rent dsfsd" CurrencyID="USD" TransactionTypeID="RE" PropertySubTypeGroupID="4" SearchBy="WithoutGeo" /><Keyid="d695f924-6ce6-405b-a561-fa3269f41221"</parameters> 
<parameters>SearchName="Apartement ..." DefaultRegionID="446931c9-7efe-440d-b674-24b8659087a7" CurrencyID="USD" AreaID="e90f1e83-ce84-46b6-826a-3775ffd2815d,dc2c2435-b773-424f-a279-4141efd21b78,ce142f26-2b08-419d-86a2-943bea72b279,b5749fe2-9360-48c0-8ffc-f6c9a343f2fa,a3a559c2-4c7e-4b4c-8314-335e9e655472,c3cd7728-3e6a-4787-959f-8e9e824b02d0" TransactionTypeID="RE" PropertySubTypeGroupID="3,2,4" MMAX="1500" LocationIdAgregate="" AreaIdAgregate="e90f1e83-ce84-46b6-826a-3775ffd2815d,dc2c2435-b773-424f-a279-4141efd21b78,ce142f26-2b08-419d-86a2-943bea72b279,b5749fe2-9360-48c0-8ffc-f6c9a343f2fa,a3a559c2-4c7e-4b4c-8314-335e9e655472,c3cd7728-3e6a-4787-959f-8e9e824b02d0" StateIdAgregate="1D6E6621-3179-4D54-A9D8-89E6F438FF3B,8C79C6B5-B61A-45F9-8560-91AE4825AC6A" InterfaceAreaIdAgregate="e90f1e83-ce84-46b6-826a-3775ffd2815d,dc2c2435-b773-424f-a279-4141efd21b78,ce142f26-2b08-419d-86a2-943bea72b279,b5749fe2-9360-48c0-8ffc-f6c9a343f2fa,a3a559c2-4c7e-4b4c-8314-335e9e655472,c3cd7728-3e6a-4787-959f-8e9e824b02d0" SearchBy="ByRegion" /><Keyid="37ad0ed5-1800-417b-8e17-9ff5084086a2"</parameters> 
<parameters>SearchName="Apartment a" DefaultRegionID="446931c9-7efe-440d-b674-24b8659087a7" CurrencyID="USD" AreaID="49401e55-95c1-42cb-9242-9468707e7d8a" TransactionTypeID="SE" PropertySubTypeGroupID="16" AreaIdAgregate="49401e55-95c1-42cb-9242-9468707e7d8a" StateIdAgregate="97F9F29F-149E-4E53-A470-96CC8499A64B" SearchBy="ByRegion" /><Keyid="39fb945c-b048-4942-be86-17f692539ba3"</parameters> 
<parameters>SearchName="Apartment, Location, 5 rooms" CountryID="446931C9-7EFE-440D-B674-24B8659087A7" DefaultRegionID="446931C9-7EFE-440D-B674-24B8659087A7" CurrencyID="USD" LocationID="E22C7349-FD77-407A-88A4-BD39A105B986" TransactionTypeID="RE" PropertySubTypeGroupID="1,2,3,4" NumberOfRoomsMin="5" InterfaceLocation="5"</parameters> 
<parameters>SearchName="Apartment" DefaultRegionID="446931c9-7efe-440d-b674-24b8659087a7" CurrencyID="USD" TransactionTypeID="SE" PropertySubTypeGroupID="16" SearchBy="ByLocality" InterfaceLocation="5" LocationID="184e17b3-9d27-46fd-8a19-a9f402dfe680" /><Keyid="39fb945c-b048-4942-be86-17f692539ba3"</parameters> 
' 

Declare @Map table (MapSeq int,MapFrom varchar(50),MapTo varchar(50)) 
Insert Into @Map values 
(1,'<parameters>',' '), 
(1,'</parameters>','||'), 
(2,'</',' '), 
(2,'<',' '), 
(2,'>',' '), 
(2,'/',' '), 
(9,'azmi',''),  -- Caused and Exception First Row: ...RE"/><azmi/></parameters> 
(9,'§','')   -- Caused and Exception First Row: value outside a quoted attribute value 

Select @String = Replace(@String,MapFrom,MapTo) From @Map 
Declare @NewString varchar(max) ='';Select @NewString = @NewString + NewString from (Select NewString='<row id="'+cast(Key_PS as varchar(25))+'" '+Key_Value+' />' from [dbo].[udf-Str-Parse](@String,'||') Where Key_Value <>'') A 

Declare @XML xml = cast(@NewString as XML) 
Select ID = r.value('@id','int') 
     ,Item = Attr.value('local-name(.)','varchar(100)') 
     ,Value = Attr.value('.','varchar(max)') 
From @XML.nodes('/row') as A(r) 
Cross Apply A.r.nodes('./@*[local-name(.)!="id"]') as B(Attr) 

返回

ID Item     Value 
1 SearchName    Flat 
1 SearchFormTemplateId Search 
1 SearchFormInfo   :ID_.Modules.Business.SearchModule.Label.SearchType.RE.Residential:LDSBL_15 km%15,10 km%10,5 km%5,20 km%20:LSTG_3,2,4:DR_3572ad9b-44cb-4229-a512-3037562d7cc7 
1 SubTypeGroupId   3,2,4 
1 InterfaceLocation  3.5908783699254903 
1 CountryId    446931c9-7efe-440d-b674-24b8659087a7 
1 Month     2000 
1 AdMaterialTransactionTypeId  RE 
2 SearchName    Apartment and.. 
2 CountryID    446931C9-7EFE-440D-B674-24B8659087A7 
2 DefaultRegionID   446931C9-7EFE-440D-B674-24B8659087A7 
2 CurrencyID    USD 
... 
11 SearchName    Apartment 
11 DefaultRegionID   446931c9-7efe-440d-b674-24b8659087a7 
11 CurrencyID    USD 
11 TransactionTypeID  SE 
11 PropertySubTypeGroupID 16 
11 SearchBy    ByLocality 
11 InterfaceLocation  5 
11 LocationID    184e17b3-9d27-46fd-8a19-a9f402dfe680 
11 Keyid     39fb945c-b048-4942-be86-17f692539ba3 

的UDF分析器

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimeter varchar(10)) 
--Usage: Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',') 
--  Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ') 

Returns @ReturnTable Table (Key_PS int IDENTITY(1,1), Key_Value varchar(max)) 
As 
Begin 
    Declare @XML xml;Set @XML = Cast('<x>' + Replace(@String,@Delimeter,'</x><x>')+'</x>' as XML) 
    Insert Into @ReturnTable Select ltrim(rtrim(String.value('.', 'varchar(max)'))) FROM @XML.nodes('x') as T(String) 
    Return 
End