sql函数返回给定查询字符串的名称和值的表

时间:2009-04-16 12:03:43

标签: sql sql-server function user-defined-functions

任何人都有一个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中;查询字符串仅用作数据。

3 个答案:

答案 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 answer

this

this

答案 2 :(得分:0)

出于安全原因,请不要直接在网址中对您的查询字符串进行编码:任何人都可以轻松替换任何旧查询以获取他们不应拥有的信息 - 或者更糟糕的是,“{ {1}}”。检查可疑的“关键字”或引用字符之类的东西不是解决方案 - 创意黑客会解决这些问题,你会惹恼所有姓氏为“O'Reilly”的人。

例外:仅限内部服务器或公共DROP DATABASE;网址。但即便如此,也没有理由不能在客户端构建SQL查询并从那里提交。