Функция STRING_SPLIT в SQL Server 2014 - PullRequest
0 голосов
/ 10 апреля 2019

Я начал анализировать логи с помощью T-SQL. У меня есть одна проблема, с которой я не могу справиться.

Пример сообщения:

LogsID = "1" Value="1" Value="2" Value="3"

Так что у меня нет проблем с разделением, когда я знаю, сколько у меня есть Value, например:

Я использую код из раздела кода для разделения этих данных, как показано ниже:

LogsID  Value
---------------    
   1      1

Код:

DECLARE @String VARCHAR(1024);

SET @String = 'LogsID = "1" Value="1" Value="2" Value="3"'

SELECT 
    SUBSTRING(@String, 
              CHARINDEX('Logs_ID="', @String) + 11, 
              CHARINDEX('Value="', @String) - (CHARINDEX('Logs_ID="', @String) + 13))

Но я не знаю, как обстоят дела с журналами, как показано ниже, когда я не знаю, сколько записей «value» содержится в строке журнала:

LogsID = "1" Value="1" Value="2" Value="3"

Я хочу разбить эту информацию следующим образом:

LogsID  Value
------------    
   1    1
   1    2
   1    3

1 Ответ

2 голосов
/ 10 апреля 2019

С помощью функции разделения (есть много способов сделать это до SQL Server 2016, вот один из них):

CREATE FUNCTION [dbo].[SplitString]
(
    @List NVARCHAR(MAX),
    @Delim VARCHAR(255)
)
RETURNS TABLE
AS
    RETURN ( SELECT [Value] FROM 
      ( 
        SELECT 
          [Value] = LTRIM(RTRIM(SUBSTRING(@List, [Number],
          CHARINDEX(@Delim, @List + @Delim, [Number]) - [Number])))
        FROM (SELECT Number = ROW_NUMBER() OVER (ORDER BY name)
          FROM sys.all_objects) AS x
          WHERE Number <= LEN(@List)
          AND SUBSTRING(@Delim + @List, [Number], LEN(@Delim)) = @Delim
      ) AS y
    );

Запрос становится проще, чем набор символов и т. Д. И неизвестная конечная точка:

DECLARE @String VARCHAR(1024) = 'LogsID = "1" Value="1" Value="2" Value="3"';

;WITH x AS
(
  SELECT value, p = PARSENAME(value,1) 
  FROM dbo.SplitString(@String, 'Value=')
),
l AS
(
  SELECT LogsID = PARSENAME(LTRIM(SUBSTRING(value,CHARINDEX('=',value)+1,255)),1) 
  FROM x WHERE p IS NULL
)
SELECT l.LogsID,y.p FROM l
CROSS JOIN (SELECT p FROM x WHERE p IS NOT NULL) AS y;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...