任何人都有一个t-sql函数,它从一个url获取一个查询字符串并返回一个名称/值对的表?
例如,我有一个存储在我的数据库中的值:
foo=bar&baz=qux&x=y
我想生成一个2列(key和val)表(本例中有3行),如下所示:
name | value
-------------
foo | bar
baz | qux
x | y
更新:我需要在t-sql函数中使用它;我无法在应用程序代码中执行此操作。也许我可以在函数中使用CLR代码,但我不想这样做。
UPDATE:'querystring'是指'?'之后的url部分。我并不是说查询的一部分会在url中;查询字符串仅用作数据。
答案 0 :(得分: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
利用this通用分割函数:
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
最终让你做这样的事情:
select name, value
from dbo.fn_splitQuerystring('foo=bar&baz=something&x=y&y&abc=&=whatever')
答案 1 :(得分:1)
我确信TSQL可以强制为你跳过这个环,但是为什么不解析你最有可能属于你的应用程序代码中的查询字符串呢?
然后你可以查看this answer其他人用什么来解析查询字符串到名称/值对。
或this。
或this。
答案 2 :(得分:0)
出于安全原因,请不要直接在网址中对您的查询字符串进行编码:任何人都可以轻松替换任何旧查询以获取他们不应拥有的信息 - 或者更糟糕的是,“{ {1}}”。检查可疑的“关键字”或引用字符之类的东西不是解决方案 - 创意黑客会解决这些问题,你会惹恼所有姓氏为“O'Reilly”的人。
例外:仅限内部服务器或公共DROP DATABASE;
网址。但即便如此,也没有理由不能在客户端构建SQL查询并从那里提交。