Sql-запрос, проблема с вложенной строкой

#asp.net #sql #sql-server #sql-server-2005 #sql-server-2008

#asp.net #sql #sql-сервер #sql-server-2005 #sql-server-2008

Вопрос:

у меня есть небольшой вопрос

у меня есть следующие данные в столбце базы данных.

isLoggedIn=Falseamp;CurrentReferral=http://ufone.testSite.tv/Messaging.aspx?aspxerrorpath=/abc.aspxamp;kw=amp;FirstVisitDate= 10/10/2011 6:52:38 УТРАamp;FirstReferral=http://www.TestSite.tv/CustomerCare.aspx?ссылка=CustomerCareamp;ExternalReferrer=http://www.TestSite.tv/CustomerCare.aspx?link=CustomerCare,http://testSite.tv/Signin.aspxamp;UserTotalVisits=2amp;ContactId=819amp;tenantChannelName=Ufone GSM channelamp;tenantChannelUrl=http://ufone.testSite.tv/amp;mcid=amp;ASP.NET_SessionId=ksntwa55yh3u3s45xn5rysyjamp;IsVisitTracked=yes

что мне нужно сделать, так это получить только ‘ExternalReferrer’ из этого, например

ExternalReferrer=http://www.TestSite.tv/CustomerCare.aspx?link=CustomerCare,http://testSite.tv/Signin.aspxamp;UserTotalVisits=2amp;ContactId=819amp;tenantChannelName=Ufone GSM канал и tenantChannelUrl=http://ufone.TestSite.tv/

я пробовал вложенную строку, но не смог получить это

 declare @myData nvarchar (1000)
set @myData= 'isLoggedIn=Falseamp;CurrentReferral=http://ufone.testSite.tv/Messaging.aspx?aspxerrorpath=/abc.aspxamp;kw=amp;FirstVisitDate=10/10/2011 6:52:38 AMamp;FirstReferral=http://www.testSite.tv/CustomerCare.aspx?link=CustomerCareamp;ExternalReferrer=http://www.testSite.tv/CustomerCare.aspx?link=CustomerCare,http://testSite.tv/Signin.aspxamp;UserTotalVisits=2amp;ContactId=819amp;tenantChannelName=Ufone GSM channelamp;tenantChannelUrl=http://ufone.testSite.tv/amp;mcid=amp;ASP.NET_SessionId=ksntwa55yh3u3s45xn5rysyjamp;IsVisitTracked=yes'



SELECT  SUBSTRING(@myData, CHARINDEX ('ExternalReferrer' ,@myData ), CHARINDEX ('mcid' ,@myData )) AS Initial 
  

я использую sql 2008

Комментарии:

1. Какую ошибку вы получаете — я скопировал и вставил ваш код, и он работал нормально

2. Он не выдает ошибки, но не возвращает желаемый результат (см. Раздел «что мне нужно сделать» в вопросе).

Ответ №1:

Третий параметр SUBSTRING — это длина возвращаемой строки, поэтому вам нужно вычесть позицию amp;mcid из позиции external :

 select 
    substring
    (
        @mydata, 
        charindex('external', @mydata), 
        charindex('amp;mcid', @mydata) - charindex('external', @mydata)
    )
  

Редактировать:

С какими данными вы выполняете мою инструкцию SQL?
Я использовал MyData объявление из вашего вопроса.

Этот фрагмент кода выполняется на моем компьютере в SQL Server Management Studio 2008 и возвращает точно желаемый результат, как показано в вашем вопросе:

 declare @myData nvarchar (1000)
set @myData= 'isLoggedIn=Falseamp;CurrentReferral=http://ufone.testSite.tv/Messaging.aspx?aspxerrorpath=/abc.aspxamp;kw=amp;FirstVisitDate=10/10/2011 6:52:38 AMamp;FirstReferral=http://www.testSite.tv/CustomerCare.aspx?link=CustomerCareamp;ExternalReferrer=http://www.testSite.tv/CustomerCare.aspx?link=CustomerCare,http://testSite.tv/Signin.aspxamp;UserTotalVisits=2amp;ContactId=819amp;tenantChannelName=Ufone GSM channelamp;tenantChannelUrl=http://ufone.testSite.tv/amp;mcid=amp;ASP.NET_SessionId=ksntwa55yh3u3s45xn5rysyjamp;IsVisitTracked=yes'

select 
    substring
    (
        @mydata, 
        charindex('external', @mydata), 
        charindex('amp;mcid', @mydata) - charindex('external', @mydata)
    )
  

РЕДАКТИРОВАТЬ 2:

Второй параметр SUBSTRING определяет начальную позицию возвращаемых символов.
В моем первом ответе это был первый символ «ExternalReferrer=» из-за charindex(...) .

Если вы хотите исключить «ExternalReferrer=» из результата, вам просто нужно добавить длину этой строки ко второму SUBSTRING параметру, чтобы возвращаемая строка начиналась сразу после «ExternalReferrer=» :

 select 
    substring
    (
        @mydata, 
        charindex('external', @mydata)   len('externalreferrer='), 
        charindex('amp;mcid', @mydata) - charindex('external', @mydata)
    )
  

РЕДАКТИРОВАТЬ 3:

Моя ошибка.
В моем последнем редактировании я переместил начальную позицию возвращаемых символов вправо.
Но я не менял длину возвращаемой строки, поэтому, конечно, конечная позиция также переместилась вправо (вот почему amp;mcid= материал был возвращен снова)
Решение состоит не только в том, чтобы добавить длину «ExternalReferrer =» к начальной позиции, но и вычесть ее из конечнойпозиция также:

 select 
    substring
    (
        @mydata, 
        charindex('external', @mydata)   len('externalreferrer='), 
        charindex('amp;mcid', @mydata) - charindex('external', @mydata) - len('externalreferrer=')
    )
  

Комментарии:

1. это то, что я получил сообщение 537, уровень 16, состояние 2, строка 2 Недопустимый параметр длины, переданный функции LEFT или SUBSTRING.

2. вау, это работает, но могу ли я исключить это внешнее из конечного результата?

3. @mahisama: Да, смотрите мой ответ (отредактированный снова). Если мой ответ был полезен, было бы неплохо, если бы вы приняли его как правильный ответ (и проголосовали за него, но вы пока не можете этого сделать, вам нужно 15 повторений. для этого).

4. я тоже получаю эту часть в результате.. amp;mcid=amp;ASP.NET_Se чего я не хочу

5. это последнее, что мне нужно. =(

Ответ №2:

Я считаю, что это то, что вы хотите:

 SELECT SUBSTRING(@myData, PATINDEX('%ExternalReferrer%' ,@myData ), PATINDEX('%mcid%' ,@myData ) - PATINDEX('%ExternalReferrer%' ,@myData ) - 1) AS Initial  
  

Но очень специфичен для этой строки, поэтому вам нужно быть осторожным, если у вас есть другая строка mcid в вашем URL.

Ответ №3:

Если вы знаете, что каждый раз mcid будет сразу ExternalReferrer после этого, попробуйте запустить это регулярное выражение в своем asp.net коде:

 /ExternalReferrer=(.*)amp;mcid/
  

Соответствующая группа $1 даст вам значение, которое вы ищете.r

Комментарии:

1. Это недопустимый оператор SQL

2. Теги, упомянутые в вопросе, также содержат asp.net , поэтому ответ содержит код, который может быть выполнен в asp.net