【问题标题】:Parse URL parameters using T-SQL使用 T-SQL 解析 URL 参数
【发布时间】:2019-07-23 13:56:26
【问题描述】:

我有一些用于数字营销的网址。这些 URL 有参数,所以我想解析 URL 并插入一个表格。用于跟踪活动和分析。

例如:

https://www.example.com/?utm_source=google&utm_medium=blabla&utm_campaign=gameuser&utm_term=winwin&utm_content=takego

我想要这样的插入表。我该怎么做?

【问题讨论】:

  • 我用的是MS SQL 2012,没有split_part功能。
  • 你创建了一个split()函数?
  • 你真的,真的不想在 TSQL 中这样做。您最好为此使用编程语言,并将已解析的值发送到数据库。

标签: sql sql-server parsing url-parameters


【解决方案1】:

你可以使用函数

CREATE FUNCTION [dbo].[ufn_ParseQueryString] ( @QueryString AS VARCHAR(MAX) )  RETURNS @QueryStringTable TABLE ( [Key] VARCHAR(100), [Value] VARCHAR(1000) ) AS BEGIN
DECLARE @QueryStringPair        VARCHAR(2000)
DECLARE @Key                    VARCHAR(100)
DECLARE @Value                  VARCHAR(1000)

WHILE LEN(@QueryString) > 0
BEGIN
    SET @QueryStringPair = LEFT ( @QueryString, ISNULL(NULLIF(CHARINDEX('&', @QueryString) - 1, -1), 
                                  LEN(@QueryString)))
    SET @QueryString = SUBSTRING( @QueryString, ISNULL(NULLIF(CHARINDEX('&', @QueryString), 0), 
                                  LEN(@QueryString)) + 1, LEN(@QueryString))

    SET @Key   = LEFT (@QueryStringPair, ISNULL(NULLIF(CHARINDEX('=', @QueryStringPair) - 1, -1), 
                       LEN(@QueryStringPair)))
    SET @Value = SUBSTRING( @QueryStringPair, ISNULL(NULLIF(CHARINDEX('=', @QueryStringPair), 0), 
                            LEN(@QueryStringPair)) + 1, LEN(@QueryStringPair))

    INSERT INTO @QueryStringTable ( [Key], [Value] )
    VALUES ( @Key, @Value )
END

RETURN

结束

测试

SELECT * FROM [dbo].[ufn_ParseQueryString] ( 'pubid=mdfbgd&utm_source=facebook&utm_medium=digimun&placement=Instagram_Stories' )

【讨论】:

    【解决方案2】:

    理想情况下,您将在存储过程中执行此操作,以便您可以将工作分成小块。您可以在 1 个 SQL 语句中完成所有操作,但是当您获得最后几个参数时,它变得有点像噩梦!

    基本的方法是使用 CHARINDEX & SUBSTRING 的组合来解析 URL... 你找到第一个了吗?然后从那里到第一个 & (然后在 = 的两侧拆分)然后找到下一个 & (由 = 拆分)并冲洗并重复。

    我已经为你开始了这个过程 - 你应该能够扩展它以从 URL 获取其余参数 - 它有点慢和笨重,但至少你可以看到发生了什么:

    运行这段 SQL,你很快就会明白:

    declare @str VARCHAR(8000)= 'https://www.example.com/?utm_source=google&utm_medium=blabla&utm_campaign=gameuser&utm_term=winwin&utm_content=takego'
    
    DECLARE @str1 VARCHAR(8000)= SUBSTRING(@str, CHARINDEX( '?',@str, 1)+1, CHARINDEX( '&',@str, 1) -CHARINDEX( '?',@str, 1)-1)
    
    SELECT SUBSTRING(@str1, 1, CHARINDEX( '=',@str1, 1)-1)
    
    SELECT SUBSTRING(@str1, CHARINDEX( '=',@str1, 1)+1, LEN(@Str1))
    
    DECLARE @str2  VARCHAR(8000) = SUBSTRING(@str, CHARINDEX( '?',@str, 1) + len(@str1) + 2, LEN(@str))
    
    SELECT @str2 = SUBSTRING(@str2, 1, CHARINDEX( '&',@str2, 1)-1)
    
    SELECT @str2
    

    【讨论】:

    • 感谢约翰的回答。是的,我想用存储过程来做这个。因为我有一张桌子,而且有很多这样的网址。每天都插入新的网址。我该怎么做自动通过程序?
    • 要让这种方法对表起作用,需要某种循环。如果您的表大小相对较小且增长缓慢,这可能不是一个大问题。所以我建议运行某种while循环并解析你需要的列,然后在循环中一次插入一行,直到全部完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多