SQL Server 2014中的功能STRING_SPLIT

时间:2019-04-10 18:11:41

标签: sql sql-server tsql

我开始使用T-SQL分析日志。我有一个问题无法解决。

示例消息:

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

例如,当我知道自己有多少价值时,我就不用拆分它了。

我使用代码部分中的代码来分割数据,如下所示:

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

但是当我不知道日志字符串中有多少个“值”条目时,我不知道如何处理如下所示的日志:

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

我想像这样分割这些信息:

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

2 个答案:

答案 0 :(得分:2)

具有拆分功能(在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
    );

查询变得比一堆charindex等和终结点未知更简单:

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;

答案 1 :(得分:1)

在SQL Server 2016之前,SQL Server中的STRING_SPLIT函数不可用,根据Microsoft的文档,您至少应具有兼容级别130。

访问this link 您可以在下面找到每个版本及其兼容性级别的摘要

SQL Server版本>>>兼容级别

SQL Server 2019预览>>> 150

SQL Server 2017(14.x)>>> 140

SQL Server 2016(13.x)>>> 130

SQL Server 2014(12.x)>>> 120

SQL Server 2012(11.x)>>> 110

SQL Server 2008 R2 >>> 100

SQL Server 2008 >>> 100

SQL Server 2005(9.x)>>>> 90

SQL Server 2000 >>>> 80