Procédure stockée pour parsingr une string

J'ai besoin d'écrire une procédure stockée pour laquelle l'input est une string.

La string d'input contient des noms de variables et leurs valeurs séparées par un délimiteur de pipeline comme ceci:

Name =Praveen | City=Hyderabad | Mobile=48629387429| Role=User| etc 

Dans la procédure stockée, j'ai déclaré des variables comme @x, @y, @z, @t pour get des valeurs comme

 @x=Praveen (Name value) @y=Hyderabad (City Value) @z=48629387429(Mobile Value) @t=User(Role Value) 

Aussi la string d'input peut avoir les valeurs dans n'importe quel ordre comme

 City=Hyderabad | Mobile=48629387429 | Role=User | Name =Praveen |etc 

Une fois que j'ai @x, @y, @z, @t les valeurs dans @x, @y, @z, @t etc, je dois utiliser ces valeurs dans la procédure stockée.

Veuillez me laisser savoir comment je peux parsingr la string d'input pour get les valeurs de Name, City, Mobile, Role dans @x, @y, @z et @t respectivement.

Une solution possible est d'utiliser XML

 DECLARE @text VARCHAR(1000) ,@xml xml SELECT @text = 'City=Hyderabad | Mobile=48629387429 | Role=User | Name =Praveen' SELECT @text = REPLACE(@text,'|','"') ,@text = REPLACE(@text,'=','="') ,@text = '<row ' + @text + '"/>' SELECT @xml = CAST(@text AS XML) select line.col.value('@Name[1]', 'varchar(100)') AS Name ,line.col.value('@City[1]', 'varchar(100)') AS City ,line.col.value('@Mobile[1]', 'varchar(100)') AS Mobile ,line.col.value('@Role[1]', 'varchar(100)') AS Role FROM @xml.nodes('/row') AS line(col) 

Je recommand vraiment de faire votre parsing de string sur le côté du programme, par opposition au côté des données. Cela étant dit, si vous devez absolument vous pouvez essayer de faire quelque chose de similaire à ceci:

 DECLARE @Ssortingng [nvarchar](256) = 'Name=Praveen | City=Hyderabad | Mobile=48629387429 | Role=User |' DECLARE @name [nvarchar](256) = (SELECT SUBSTRING(@Ssortingng, CHARINDEX('Name=', @Ssortingng)+5, CHARINDEX('|', @Ssortingng))) DECLARE @city [nvarchar](256) = (SELECT SUBSTRING(@Ssortingng, CHARINDEX('City=', @Ssortingng)+5, CHARINDEX('|', @Ssortingng))) DECLARE @mobile [nvarchar](256) = (SELECT SUBSTRING(@Ssortingng, CHARINDEX('Mobile=', @Ssortingng)+7, CHARINDEX('|', @Ssortingng))) DECLARE @role [nvarchar](256) = (SELECT SUBSTRING(@Ssortingng, CHARINDEX('Role=', @Ssortingng)+5, CHARINDEX('|', @Ssortingng))) SELECT RTRIM(LTRIM(LEFT(@name, CHARINDEX('|', @name)-1))) AS Name, RTRIM(LTRIM(LEFT(@city, CHARINDEX('|', @city)-1))) AS City, RTRIM(LTRIM(LEFT(@mobile, CHARINDEX('|', @mobile)-1))) AS Mobile, RTRIM(LTRIM(LEFT(@role, CHARINDEX('|', @role)-1))) AS Role 

Cela renvoie:

  Name | City | Mobile | Role ________________________________________________ Praveen | Hyderabad | 48629387429 | User 

Notez que la longueur ajoutée du CHARINDEX dans les requêtes initiales est égale à la string de search.

"Name =" est égal à 5 ​​caractères, donc nous ajoutons 5 pour déplacer l'index après le signe =, "Mobile =" est égal à 7, donc nous ajoutons 7.

De même, à la fin de la requête SELECT nous soustrayons 1 de chaque CHARINDEX pour supprimer le | symbole.

Sources:

SUBSTRING

CHARINDEX

LA GAUCHE

LTRIM

RTRIM

Supposons que votre paramètre d'input s'appelle @Text.

 DECLARE @Text varchar(255), @x varchar(255) SET @Text = 'Name=Praveen | City=Hyderabad | Mobile=48629387429| Role=User' -- Added to show how to account for non-trailing | SET @Text = @Text + ' | '; SET @x = LTRIM(RTRIM(subssortingng( @Text, charindex('Name=', @Text) + LEN('Name='), charindex(' | ', @Text, charindex('Name=', @Text)) - LEN('Name=') ))) SELECT @x 

Ensuite, répétez simplement ceci pour @y, @z, @t changez Name = quelle que soit votre pause.

Voici une façon amusante d'utiliser une boucle pour la manipulation de strings. Notez comment nous définissons notre variable @x, @y, etc. pour saisir une valeur particulière.

 -- Simulate proc parameter declare @input nvarchar(max) = 'Name =Praveen | City=Hyderabad | Mobile=48629387429| Role=User' -- OP's preferred destination vars declare @x nvarchar(max) = 'Name' declare @y nvarchar(max) = 'City' declare @z nvarchar(max) = 'Mobile' declare @t nvarchar(max) = 'Role' -- The key/value delimiters we are expecting declare @recordDelim nchar(1) = '|' declare @valueDelim nchar(1) = '=' -- Temp storage declare @inputTable table ( name nvarchar(128) not null primary key , value nvarchar(max) null ) -- Get all key/value pairs while lsortingm(rsortingm(@input)) != '' begin insert into @inputTable (name) select lsortingm(rsortingm(replace(left(@input, isnull(nullif(charindex(@recordDelim, @input), 0), len(@input))), @recordDelim, ''))) select @input = lsortingm(rsortingm(right(@input, len(@input) - isnull(nullif(charindex(@recordDelim, @input), 0), len(@input))))) end -- Separate keys and values update @inputTable set name = lsortingm(rsortingm(left(name, isnull(nullif(charindex(@valueDelim, name) - 1, 0), len(name))))) , value = lsortingm(rsortingm(right(name, len(name) - isnull(nullif(charindex(@valueDelim, name), 0), len(name))))) -- Populate the variables -- If any are null, then this key/value wasn't present set @x = (select value from @inputTable where name = @x) set @y = (select value from @inputTable where name = @y) set @z = (select value from @inputTable where name = @z) set @t = (select value from @inputTable where name = @t) 

En outre, à partir de l'espacement irrégulier dans votre input, je suppose que vous voulez couper tout ce qui arrive (ce qui explique pourquoi ce proc fait cela partout).