2012-01-24 9 views
1

SQL ServerでQueryStringパラメータ(例:foo = bar & temp = baz)を解析する簡単な方法はありますか?SQL Server 2005でQueryStringを解析する

私が最後に必要とするのは、名前と値のペアを持つ「テーブル」です。

| foo | bar | 
| temp | baz | 

文字列エスケープ文字(たとえば%の3D)とを含むように起動する場合、それが難しくなる上の例では簡単であろうがUTF-8が関与しても厳しいです。

既存のソリューションはありますか? SQL Server用のURLDecodeの実装は、地球上で天国になります。

+1

関連スレッド - http://stackoverflow.com/questions/3833229/sql-server-url-decoding – adatapost

+0

TSQLよりもCLR統合に適していると思われます。または、データを提出する前にアプリケーションで実行できないことがありますか? –

+0

私は古代のClassicASPウェブショップシステムを扱っています。データをDBに書き込むルーチンを変更することもできますが、他の場所で何が破壊されるかはわかりません...後で... – BlaM

答えて

6

クエリ文字列を解析するには、関数内でCTEを使用してください。ここにコードがあります。

CREATE FUNCTION dbo.SplitQueryString (@s varchar(8000)) 
RETURNS table 
AS 
RETURN (
    WITH splitter_cte AS (
     SELECT CHARINDEX('&', @s) as pos, 0 as lastPos 
     UNION ALL 
     SELECT CHARINDEX('&', @s, pos + 1), pos 
     FROM splitter_cte 
     WHERE pos > 0 
    ), 
    pair_cte AS (
    SELECT chunk, 
      CHARINDEX('=', chunk) as pos 
    FROM (
     SELECT SUBSTRING(@s, lastPos + 1, 
         case when pos = 0 then 80000 
         else pos - lastPos -1 end) as chunk 
     FROM splitter_cte) as t1 
) 
    SELECT substring(chunk, 0, pos) as keyName, 
      substring(chunk, pos+1, 8000) as keyValue 
    FROM pair_cte 
) 
GO 

declare @queryString varchar(2048) 
set @queryString = 'foo=bar&temp=baz&key=value'; 
SELECT * 
    FROM dbo.SplitQueryString(@queryString) 
OPTION(MAXRECURSION 0); 

実行時に次の出力が生成されます。

keyName keyValue 
------- -------- 
foo  bar 
temp  baz 
key  value 
(3 row(s) affected) 

私はこれがあなたが求めていることを正確に行うと信じています。