【问题标题】:sql function to return table of names and values given a querystringsql函数返回给定查询字符串的名称和值表
【发布时间】:2009-04-16 12:03:42
【问题描述】:

谁有一个 t-sql 函数,它从一个 url 中获取一个查询字符串并返回一个名称/值对表?

例如,我的数据库中存储了这样的值:

foo=bar&baz=qux&x=y

我想生成一个 2 列(key 和 val)表(在本例中为 3 行),如下所示:

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

更新:我在 t-sql 函数中需要这个是有原因的;我不能在应用程序代码中做到这一点。也许我可以在函数中使用 CLR 代码,但我不想这样做。

更新:'querystring' 我的意思是 '?' 之后的 url 部分。我并不是说查询的一部分会在 url 中。查询字符串仅用作数据。

【问题讨论】:

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


    【解决方案1】:
    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')
    

    【讨论】:

      【解决方案2】:

      我确信 TSQL 可能会被强制为您跳过这个环节,但为什么不在您的应用程序代码中解析查询字符串最可能属于它的位置呢?

      然后您可以查看this answer,了解其他人在将查询字符串解析为名称/值对方面所做的工作。

      this answer

      this

      this

      【讨论】:

      • 有一些原因,在我的情况下,我需要从数据库层执行此操作,不幸的是,显然按照这些链接使用 .NET 代码会更直接。
      【解决方案3】:

      请不要直接在 URL 中编码您的查询字符串,出于安全原因:任何人都可以轻松替换任何旧查询来访问他们不应该拥有的信息 - 或者更糟的是,“@ 987654322@"。检查可疑的“关键字”或引号字符之类的东西不是解决方案——有创意的黑客会绕过这些措施,你会惹恼所有姓氏为“O'Reilly”的人。 p>

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

      【讨论】:

      • 谢谢,但我的意思是 'querystring' 在 ? 之后的 url 部分。我并不是说查询的一部分会在 url 中。
      • @Rory:是的,我也是这个意思。
      • 好的,在这种情况下,您的回答不能回答我的问题:我的数据库中有数据,我想将其转换为名称/值对表。我没有将查询放入查询字符串中。
      • @Rory:啊,我误解了对不起(实际上是三遍......)所以你的意思是你有一个像“mysite.com/xyz?foo=bar;baz=qux;x=y”这样的 URL,你想产生一个 2 列(key 和 val ) 表(在本例中为 3 行)?我确信可以做到,但我不确定有多不幸。
      • 是的。不用担心——我想这表明我应该把我的问题写得更清楚。无论如何,谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多