[英]Function STRING_SPLIT in SQL Server 2014
I started analyze logs with T-SQL.我开始使用 T-SQL 分析日志。 I have one problem i can't deal with it.我有一个问题无法处理。
Example message :示例消息:
LogsID = "1" Value="1" Value="2" Value="3"
So I don't have problem with split this when I know how much I have Value, for example :所以当我知道我有多少价值时,我没有问题,例如:
I use code from code section to split this data like below :我使用代码部分的代码来分割这些数据,如下所示:
LogsID Value
---------------
1 1
Code:代码:
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))
But I don't know how deal with logs like below when I don't know how many "value" entries are in the log string:但是当我不知道日志字符串中有多少“值”条目时,我不知道如何处理如下日志:
LogsID = "1" Value="1" Value="2" Value="3"
I want split this information like that :我想像这样拆分这些信息:
LogsID Value
------------
1 1
1 2
1 3
With a split function (there are many ways to do this prior to SQL Server 2016, here is one):使用拆分功能(在 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
);
The query becomes simpler than a bunch of charindex etc. and an unknown endpoint:查询变得比一堆 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;
The STRING_SPLIT function in SQL Server is not available before SQL Server 2016, you should have at least compatibility level 130 as per Microsoft's docs. SQL Server 中的 STRING_SPLIT 函数在 SQL Server 2016 之前不可用,根据 Microsoft 的文档,您的兼容性级别至少应为 130。
Visit this link Below you can find a summary of each version and its compatibility level访问此链接您可以在下面找到每个版本及其兼容性级别的摘要
SQL Server Versions >>> Compatibility Level SQL Server 版本 >>> 兼容性级别
SQL Server 2019 preview >>> 150 SQL Server 2019 预览 >>> 150
SQL Server 2017 (14.x) >>> 140 SQL Server 2017 (14.x) >>> 140
SQL Server 2016 (13.x) >>> 130 SQL Server 2016 (13.x) >>> 130
SQL Server 2014 (12.x) >>> 120 SQL Server 2014 (12.x) >>> 120
SQL Server 2012 (11.x) >>> 110 SQL Server 2012 (11.x) >>> 110
SQL Server 2008 R2 >>> 100 SQL Server 2008 R2 >>> 100
SQL Server 2008 >>> 100 SQL Server 2008 >>> 100
SQL Server 2005 (9.x)>>>> 90 SQL Server 2005 (9.x)>>>> 90
SQL Server 2000>>>> 80 SQL Server 2000>>>> 80
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.