在MsSql中分析正则表达式或逗号分隔的字符串

时间:2014-11-24 01:40:09

标签: sql-server regex string parsing

我之前发布过使用mssql进行解析,它将解析逗号分隔的字符串。它工作正常,但它只发布在1列。所以所有解析的字符串都只在一列中发布或显示,因为我希望它每1个解析后的字符串显示1列。现在我的问题是我有一个字符串,用逗号分隔3个第一个字符串,但其余部分没有用逗号分隔,而是我必须使用正则表达式解析它。有没有办法解析并返回每列一个结果,并使用逗号分隔方式和正则表达式进行解析。

这是我的解析代码

USE [SMSGPS]
GO
/****** Object:  UserDefinedFunction [dbo].[ufn_Parserstring]    Script Date: 11/24/2014 9:26:44  AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION [dbo].[ufn_Parserstring] ( @StringInput VARCHAR(max) )
RETURNS @OutputTable TABLE ( [String] VARCHAR(max) )
AS
BEGIN

DECLARE @String    VARCHAR(max)

WHILE LEN(@StringInput) > 0
BEGIN
SET @String      = LEFT(@StringInput, 
                        ISNULL(NULLIF(CHARINDEX(',', @StringInput) - 1, -1),
                        LEN(@StringInput)))
SET @StringInput = SUBSTRING(@StringInput,
                             ISNULL(NULLIF(CHARINDEX(',', @StringInput), 0),
                             LEN(@StringInput)) + 1, LEN(@StringInput))

INSERT INTO @OutputTable ( [String] )
VALUES ( @String )
END

RETURN
END

当我使用上面的代码使用上面的代码时,它只返回1列中的结果,我希望每列显示1个结果

以下是我如何调用函数

DECLARE @str2 varchar(max)
SET @str2  = (SELECT TOP 1 smsmsg FROM GPRSIN)

SELECT String as [Method2] from [dbo].[ufn_Parserstring] ( replace(@str2,';',',')) 

Go

这只适用于我使用这种在前3个字符串只有逗号和半冒号的字符串然后它将解析前2个字符串然后复制其余的字符串 的 351856040489593,241111; 1R,141119040115,A,1422.1425N,12103.1746E,0.0,151,1.8,01000006;

你可以看到它有逗号直到最后。但是当我使用下面的字符串时 的 351856045173481,RA1; 1000V1430.4358N12100.0132E000.0170.601.0000-6002022221114CEA1120018613D000000 ,,,,,,,,

现在我已经在这里呆了将近4天了,我需要得到所有帮助。提前感谢大家的帮助。我真的非常感谢你们所有人。

第一件事的结果是这样的(逗号分隔到结尾) enter image description here

这是直到结尾才用逗号分隔的字符串

enter image description here

1 个答案:

答案 0 :(得分:0)

如果列数未知,我会这样做。我将您的ufn更改为具有标识列,我稍后可以使用 PIVOT 结果集。如果列未知,则必须在动态SQL 中进行。

alter FUNCTION [dbo].[ufn_Parserstring] ( @StringInput VARCHAR(max),  @separators varchar(255))
RETURNS @OutputTable TABLE (
    id int identity,
    [String] VARCHAR(max)
) AS
BEGIN

    DECLARE @String    VARCHAR(max)

    WHILE LEN(@StringInput) > 0 BEGIN
        SET @String      = LEFT(@StringInput, 
                                ISNULL(NULLIF(patindex('%[' + @separators + ']%', @StringInput) - 1, -1),
                                LEN(@StringInput)))
        SET @StringInput = SUBSTRING(@StringInput,
                                     ISNULL(NULLIF(patindex('%[' + @separators + ']%', @StringInput), 0),
                                     LEN(@StringInput)) + 1, LEN(@StringInput))

        INSERT INTO @OutputTable ( [String] )
        VALUES ( @String )
    END

    RETURN
end
go

declare @str2 varchar(max), @cols varchar(255)
set @str2 = '351856040489593,241111;1R,141119040115,A,1422.1425N,12103.1746E,0.0,151,1.8,01000006;'

if object_id('tempdb..#Temp') is not null
    drop table #Temp

select *
into #Temp
from dbo.ufn_Parserstring(@str2, ',;')

select @cols = stuff((
    select ', [' + cast(id as varchar(3)) + ']'
    from #Temp
    for xml path(''), type
).value('.', 'varchar(max)'), 1, 2, '')

exec('
    select *
    from #Temp t
    pivot (
        min(t.String)
        for id in (' + @cols + ')
    ) p
');