如何在不编写函数的情况下在SQL Server中提取URL查询字符串参数?

sam*_*and 2 sql sql-server string query-string

我无法识别网站上使用的所有查询字符串参数.我想编写一个T-SQL查询来提取所有参数并对它们进行计数,但是我没有编写SQL函数的权限,因此这个解决方案没什么用处.

我正在使用的字段(Query)包含如下所示的数据:

_=1457999955221
tab=profile
tab=tags&sort=votes&page=13
page=5&sort=newest&pagesize=15
...
Run Code Online (Sandbox Code Playgroud)

我需要编写的查询将返回结果:

querystring | count
___________________
_           |  1
tab         |  2
sort        |  2
page        |  2
pagesize    |  1
...
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏.

Mar*_*ith 6

您可以从这里借用其中一个函数,并将其内联到查询中.

以下是一个例子.我不希望表现出色.到目前为止,创建CLR函数是在SQL Server 2016之前拆分字符串的最有效方法.

DECLARE @QueryStrings Table
(
Query VARCHAR(8000)
)

INSERT INTO @QueryStrings 
VALUES
('INVALID'),
('_=1457999955221'),
('tab=profile'),
('tab=tags&sort=votes&page=13'),
('page=5&sort=newest&pagesize=15');


WITH E1(N)        AS ( SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 
                        UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 
                        UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1),
    E2(N)        AS (SELECT 1 FROM E1 a, E1 b),
    E4(N)        AS (SELECT 1 FROM E2 a, E2 b),
    E42(N)       AS (SELECT 1 FROM E4 a, E2 b)
    SELECT parameter, count(*)
    FROM   @QueryStrings qs
        CROSS APPLY (SELECT SUBSTRING(qs.Query, t.N + 1, ISNULL(NULLIF(CHARINDEX('&', qs.Query, t.N + 1), 0) - t.N - 1, 8000))
                    FROM   (SELECT 0
                            UNION ALL
                            SELECT TOP (DATALENGTH(ISNULL(qs.Query, 1))) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
                            FROM   E42) t(N)
                    WHERE  ( SUBSTRING(qs.Query, t.N, 1) = '&'
                                OR t.N = 0 )) ca1(split_result) 
        CROSS APPLY (SELECT CHARINDEX('=',split_result)) ca2(pos) 
        CROSS APPLY (SELECT CASE WHEN pos > 0 THEN LEFT(split_result,pos-1) END, 
                            CASE WHEN pos > 0 THEN SUBSTRING(split_result, pos+1,8000) END
                        WHERE  pos > 0) ca3(parameter,value) 
    GROUP BY parameter
Run Code Online (Sandbox Code Playgroud)

  • 我不确切知道这个查询是如何做到的,但它看起来像我需要它做的事情.十分感谢. (2认同)
  • 这是CLR方法的一个很好的基准,以及SQL 2016中提供的新STRING_SPLIT http://sqlperformance.com/2016/03/t-sql-queries/string-split (2认同)