1

URLからクエリ文字列を取得し、名前と値のペアのテーブルを返すt-sql関数を持っている人はいますか?

たとえば、データベースに次のような値が保存されています。

foo=bar&baz=qux&x=y

次のように、2 列 (key と val) のテーブル (この例では 3 行) を作成したいと考えています。

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

更新: t-sql 関数でこれが必要な理由があります。アプリケーションコードではできません。関数で CLR コードを使用することもできますが、使用しないほうがよいでしょう。

更新:「クエリ文字列」とは、「?」の後の URL の部分を意味します。クエリの一部が URL に含まれるという意味ではありません。クエリ文字列は単にデータとして使用されます。

4

3 に答える 3

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

この汎用分割機能を利用するもの:

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')
于 2012-05-26T16:13:53.090 に答える
1

TSQL が強制的にこのフープを通過するように強制される可能性はあると思いますが、アプリケーション コード内のクエリ文字列をおそらく属する場所で解析してみませんか?

次に、クエリ文字列を名前と値のペアに解析するために他の人が行ったことについて、この回答を確認できます。

またはこの答え

またはこれ

またはこれ

于 2009-04-16T12:10:58.710 に答える
0

セキュリティ上の理由から、クエリ文字列を URL に直接エンコードしないでください。古いクエリを誰でも簡単に置き換えて、持ってはいけない情報にアクセスできてしまう可能性があります。さらに悪いことに、" DROP DATABASE;". 疑わしい「キーワード」や引用文字などをチェックしても解決策にはなりません。クリエイティブなハッカーはこれらの対策を回避し、姓が「O'Reilly」であるすべての人を困らせることになります。

例外: 社内専用サーバーまたは公開httpsURL。それでも、クライアント側で SQL クエリを作成してそこから送信できない理由はありません。

于 2009-04-16T12:11:38.223 に答える