fonction sql pour returnner la table des noms et des valeurs donné une string de requête

Quelqu'un at-il une fonction t-sql qui prend une string de requête à partir d'un URL et renvoie une table de paires nom / valeur?

Par exemple, j'ai une valeur comme celle-ci stockée dans ma database:

foo=bar&baz=qux&x=y 

et je veux produire une table de 2 colonnes (key et val) (avec 3 lignes dans cet exemple), comme ceci:

 name | value ------------- foo | bar baz | qux x | y 

MISE À JOUR: il y a une raison pour laquelle j'ai besoin de cela dans une fonction t-sql; Je ne peux pas le faire dans le code de l'application. Peut-être que je pourrais utiliser le code CLR dans la fonction, mais je préfère ne pas le faire.

UPDATE: par 'queryssortingng' je veux dire la partie de l'URL après le '?'. Je ne veux pas dire qu'une partie d'une requête sera dans l'url; le queryssortingng est juste utilisé comme données.

 create function dbo.fn_splitQueryssortingng(@queryssortingng nvarchar(4000)) returns table as /* * Splits a queryssortingng-formatted ssortingng into a table of name-value pairs * Example Usage: select * from dbo.fn_splitQuerySsortingng('foo=bar&baz=qux&x=y&y&abc=') */ return ( select 'name' = SUBSTRING(s,1,case when charindex('=',s)=0 then LEN(s) else charindex('=',s)-1 end) , 'value' = case when charindex('=',s)=0 then '' else SUBSTRING(s,charindex('=',s)+1,4000) end from dbo.fn_split('&',@queryssortingng) ) go 

Qui utilise cette fonction de partage à usage général:

 create function dbo.fn_split(@sep nchar(1), @s nvarchar(4000)) returns table /* * From https://stackoverflow.com/questions/314824/ * Splits a ssortingng into a table of values, with single-char delimiter. * Example Usage: select * from dbo.fn_split(',', '1,2,5,2,,dggsfdsg,456,df,1,2,5,2,,dggsfdsg,456,df,1,2,5,2,,') */ AS RETURN ( WITH Pieces(pn, start, stop) AS ( SELECT 1, 1, CHARINDEX(@sep, @s) UNION ALL SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1) FROM Pieces WHERE stop > 0 ) SELECT pn, SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 4000 END) AS s FROM Pieces ) go 

En fin de count, vous laisser faire quelque chose comme ceci:

 select name, value from dbo.fn_splitQueryssortingng('foo=bar&baz=something&x=y&y&abc=&=whatever') 

Je suis sûr que TSQL pourrait être contraint de sauter à travers ce cerceau pour vous, mais pourquoi ne pas parsingr la string de requête dans votre code d'application où il appartient le plus probablement?

Ensuite, vous pouvez regarder cette réponse pour ce que les autres ont fait pour parsingr les strings de requête en paires nom / valeur.

Ou cette réponse .

Ou ceci .

Ou ceci .

Veuillez ne pas encoder vos strings de requête directement dans les URL, pour des raisons de security: tout le monde peut facilement substituer une ancienne requête pour accéder à des informations qu'il ne devrait pas avoir – ou pire, " DROP DATABASE; ". La vérification de «mots-keys» suspects ou de choses comme des guillemets n'est pas une solution – les pirates informatiques vont contourner ces mesures, et vous ennuierez tous ceux dont le nom de famille est «O'Reilly».

Exceptions: servers internes ou URL https publics. Mais même alors, il n'y a aucune raison pour que vous ne puissiez pas build la requête SQL du côté client et la soumettre à partir de là.