sql >> Database teknologi >  >> RDS >> Sqlserver

mssql (tsql) procedure erstatte rækkefølge

Jeg skal ud og finde noget sæbe, men givet dine krav er dette et eksempel på, hvordan man opnår den ønskede erstatning.

-- Dette vil sandsynligvis ikke fungere særlig godt af en række-- grunde, ikke mindst af hvilke vi laver en masse strengmanipulation-- inden for tsql.-- Meget af dette forespørgsels-vrøvl kunne konsolideres i færre forespørgsler-- men i betragtning af mangel på information, valgte jeg at bygge løsningen ud-- i et tumbling data-anti-mønster; MED SAMPLE_DATA AS( -- få nogle demo data op -- med tilfældige mellemrum og id'er for at gøre gyldige testcases vælg 'xx' AS html union alle vælg 'no fix req' union alle vælg 'no fix req' union all vælg 'xy' union all vælg 'xz' union all vælg 'no fix req '), ORDINALS AS( -- Find startpositionen for nøgleordene SELECT SD.* , CHARINDEX('class=', SD. html, 0) AS class_ordinal , CHARINDEX('id=', SD.html, 0) AS id_ordinal -- Du har virkelig brug for noget her for at holde tingene ved lige -- ellers når vi samler det hele igen, bliver det forkert , ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS original_sequence FROM SAMPLE_DATA SD ), NEEDS_MODIFIED AS( -- identificer de rækker, der skal ændres -- og brug ordinalerne i forrige forespørgsel til at finde den lukkede position SELECT O.* , CHARINDEX('"', O.html, O.class_ordinal+7) + 1 AS class_ordinal_end_quote , CHARINDEX('"', O.html, O.id_ordinal+4) + 1 AS id_ordinal_end_quote FROM ORDINALS O WHERE O.id_ordinal> O.class_ordinal), FIND_PARTS AS( -- fjern delene SELECT NM.* , SUBSTRING(NM.html, class_ordinal, class_ordinal_end_quote - class_ordinal) AS class , SUBSTRING(NM.html, id_ordinal, id_ordinal_end_quote - id_ordinal) AS id_MODIFIED NM), UDFØRT SOM (VÆLG -- Dette er h sagens kerne -- efter at have identificeret de korrekte tekstværdier for klasse og id -- vil vi nu udføre en tredobbelt erstatning -- Erstat 1 udskifter klasseteksten med noget der ikke burde eksistere i kilden -- Erstat 2 erstatter id-teksten med vores klassetekst -- Erstat 3 fjerner vores pladsholderværdi med id REPLACE(REPLACE(REPLACE(FP.html, FP.class, '~~|~'), FP.id, FP.class), '~~|~ ', FP.id) AS html , FP.original_sequence FRA FIND_PARTS FP UNION ALL SELECT O.html , O.original_sequence FRA ORDINALS O WHERE O.id_ordinal  

Input

xxingen rettelsesanmodningingen rettelsesanmodningxy xzingen rettelsesanmodning 

Output

xxingen rettelsesanmodningingen rettelsesanmodningxy xzingen rettelsesanmodning 

Efter at have gjort dig nogle tanker, har du måske prøvet at bede om det som en skalær funktion. Dette vil sandsynligvis have endnu dårligere ydeevne, men det løser problemet.

-- Samme logik som ovenfor, nu i funktionsformCREATE FUNCTION dbo.ClassIdSwap( @input varchar(max))RETURNER varchar(max)ASBEGIN DECLARE @class_ordinal int , @class_text varchar(max) , @class_ordinal_end_quote int , @id_ordinal int , @id_text varchar(max) , @id_ordinal_end_quote int , @out_html varchar(max) SELECT @class_ordinal =CHARINDEX('class=', @input, 0) , @id_ordinal =CHARINDEX('id=', @ input, 0) VÆLG @class_ordinal_end_quote =CHARINDEX('"', @input, @class_ordinal+7) + 1 , @id_ordinal_end_quote =CHARINDEX('"', @input, @id_ordinal+4) + 1 -- bail out tidligt IF (@id_ordinal <@class_ordinal) BEGYND TILBAGE @input END SELECT @class_text =SUBSTRING(@input, @class_ordinal, @class_ordinal_end_quote - @class_ordinal) , @id_text =SUBSTRING(@input, @id_ordinal, @id_ordinal_end_quote) RETURN (@id_ordinal) REPLACE(REPLACE(REPLACE(@input, @klasse_tekst, '~~|~'), @id_ tekst, @klasse_tekst), '~~|~', @id_tekst))END

Brug

;WITH SAMPLE_DATA AS( -- hent nogle demodata -- med tilfældige mellemrum og id'er for at lave gyldige testcases vælg 'xx ' AS html union all vælg 'no fix req' union all select 'no fix req td>' union all vælg 'xy' union all vælg 'xz' union all vælg 'no fix req')SELECT D.html , dbo.ClassIdSwap(D.html) AS modified FROM SAMPLE_DATA D 



  1. hvordan man bruger PDO-forbindelsesobjekt i forskellige filer

  2. Hent sidst indsatte ID-formular gemt procedure i MySQL

  3. Hvorfor kan jeg oprette en tabel med PRIMARY KEY på en nullbar kolonne?

  4. Jeg kan ikke køre bundle update på grund af mysql2 gem