2009-04-16 5 views
1

Quelqu'un at-il une fonction t-sql qui extrait une chaîne de requête d'un URL et renvoie une table de paires nom/valeur?Fonction sql pour renvoyer la table des noms et des valeurs à l'aide d'une chaîne de queues

par exemple, j'ai une valeur comme celle stockée dans ma base de données:

foo=bar&baz=qux&x=y 

et je veux produire un 2 colonnes (clé et val) tableau (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.

MISE À JOUR: par 'querystring' 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 querystring est juste utilisé comme données.

Répondre

3
create function dbo.fn_splitQuerystring(@querystring nvarchar(4000)) 
returns table 
as 
/* 
* Splits a querystring-formatted string into a table of name-value pairs 
* Example Usage: 
     select * from dbo.fn_splitQueryString('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('&',@querystring) 
) 
go 

qui utilise this fonction à des fins générales division:

create function dbo.fn_split(@sep nchar(1), @s nvarchar(4000)) 
returns table 
/* 
* From https://stackoverflow.com/questions/314824/ 
* Splits a string 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 compte vous permet de faire quelque chose comme ceci:

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

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

Ensuite, vous pouvez regarder this answer pour ce que d'autres ont fait pour analyser les chaînes de requête en paires nom/valeur.

ou this answer.

ou this.

ou this.

+0

Il y a des raisons que, dans mon cas, je dois le faire de la couche de base de données, malheureusement, comme il serait évidemment plus facile de faire en utilisant le code .NET selon ces liens. – Rory

0

S'il vous plaît ne pas encoder vos chaînes de requête directement dans les URL, pour des raisons de sécurité: tout le monde peut facilement remplacer une ancienne requête pour avoir accès à l'information qu'ils ne devraient pas avoir - ou pire, « DROP DATABASE; ». n'est pas une solution - des pirates créatifs vont contourner ces mesures, et vous ennuierez tous ceux dont le nom de famille est "O'Reilly".

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

+0

merci, mais je voulais dire 'querystring' comme dans la partie de l'URL après le? Je ne veux pas dire que les parties d'une requête seront dans l'url. – Rory

+0

@Rory: Oui, c'est ce que je veux dire aussi. –

+0

ok, dans ce cas, votre réponse n'est pas une réponse à ma question: j'ai des données dans ma base de données et je veux en faire une table de paires nom/valeur. Je ne mets pas de requêtes dans la chaîne de requête. – Rory

Questions connexes