简体   繁体   English

使用SQL使用重复的特殊字符拆分查询字符串

[英]Split the query string with repeatative special characters using SQL

This is my String 这是我的弦

Declare @qstr as varchar(max)='hireteammember.aspx?empemail=kuldeep@asselsolutions.com&empid=376&empname=kuldeep&adminname=TMA1&term=5&teamid=161&contactid=614¥1&WP=100¥5¥Months&Amt=500&DueDay=5&StrDt=12/31/2013&MemCatg=Employees&StrTm=21:05&PlnHrs=5&WrkDays=true¥true¥true¥true¥true¥false¥false'

I want to extract the values of empid,empname,adminname,term,teamid,contactid,WP,Months,Dueday,StrDt,MemCatgmStrTm,PlnHrs,WrkDays and assign them to new variables 我想提取Empid,empname,adminname,term,teamid,contactid,WP,Months,Dueday,StrDt,MemCatgmStrTm,PlnHrs,WrkDays的值并将它们分配给新变量

I have used 我用过

select ( SUBSTRING(@qstr,CHARINDEX('=',@qstr)+1,CHARINDEX('&',@qstr)-CHARINDEX('=',@qstr)-1)))

but only getting the 'empemail' , for the next occurance of special char '&' , not able to get the values of further terms , if i am using '&' in spite of '=' . 但仅在下次出现特殊字符'&'时才获取'empemail',但即使我使用'&'而不是'=',也无法获取其他项的值。

Help me to split the whole string 帮我把整个弦分开

How about using XML to split the values into rows, and then splitting them into columns. 如何使用XML将值拆分为行,然后将其拆分为列。

Something like 就像是

Declare @qstr as varchar(max)='hireteammember.aspx?empemail=kuldeep@asselsolutions.com&empid=376&empname=kuldeep&adminname=TMA1&term=5&teamid=161&contactid=614¥1&WP=100¥5¥Months&Amt=500&DueDay=5&StrDt=12/31/2013&MemCatg=Employees&StrTm=21:05&PlnHrs=5&WrkDays=true¥true¥true¥true¥true¥false¥false'

DECLARe @str VARCHAR(MAX) = SUBSTRING(@qstr,CHARINDEX('?',@qstr,0) + 1, LEN(@qstr)-CHARINDEX('?',@qstr,0))
DECLARE @xml XML
SELECT  @xml = CAST('<d>' + REPLACE(@str, '&', '</d><d>') + '</d>' AS XML)

;WITH Vals AS (
        SELECT  T.split.value('.', 'nvarchar(max)') AS data
        FROM    @xml.nodes('/d') T(split)
)
SELECT  LEFT(data,CHARINDEX('=',data,0) - 1),
        RIGHT(data,LEN(data) - CHARINDEX('=',data,0))
FROM    Vals

SQL Fiddle DEMO SQL小提琴演示

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);

when run produces the following output. 运行时将产生以下输出。

keyName  keyValue

-------  --------

foo      bar

temp     baz

key      value

(3 row(s) affected)

I believe that this will do exactly what you are asking. 我相信这将完全满足您的要求。

SQL FIDDLE DEMO SQL FIDDLE DEMO

If the order of the values in the html string remains same i would suggest using the whole string name like 如果html字符串中值的顺序保持不变,我建议使用整个字符串名称,例如

select ( SUBSTRING(@qstr,CHARINDEX('empemail=',@qstr)+1,CHARINDEX('&empid=',@qstr)-CHARINDEX('empemail=',@qstr)-1)))

If you are still looking for nth occurance then refer to this link 如果您仍在寻找第n次发生,请参考此链接

    Declare @qstr as varchar(max)='hireteammember.aspx?empemail=kuldeep@asselsolutions.com&empid=376&empname=kuldeep&adminname=TMA1&term=5&teamid=161&contactid=614¥1&WP=100¥5¥Months&Amt=500&DueDay=5&StrDt=12/31/2013&MemCatg=Employees&StrTm=21:05&PlnHrs=5&WrkDays=true¥true¥true¥true¥true¥false¥false'

(select ( SUBSTRING(@qstr,CHARINDEX('&empname=',@qstr)+1,CHARINDEX('&adminname=',@qstr)-CHARINDEX('&empname=',@qstr)-1)))

(select ( SUBSTRING(@qstr,CHARINDEX('?empemail=',@qstr)+1,CHARINDEX('&empid=',@qstr)-CHARINDEX('?empemail=',@qstr)-1)))   

like this i have splitted and updated The whole string. 像这样,我已经拆分并更新了整个字符串。 Thank you All for your answers, Your answers Helped me to solve this 谢谢大家的回答,您的回答帮助我解决了这个问题

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM