Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在MsSql中解析正则表达式或逗号分隔的字符串_Sql Server_Regex_String_Parsing - Fatal编程技术网

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

Sql server 在MsSql中解析正则表达式或逗号分隔的字符串,sql-server,regex,string,parsing,Sql Server,Regex,String,Parsing,我以前在这里发布过关于使用mssql解析的文章,mssql将解析逗号分隔的字符串。它运行得很好,但只在1栏中发布。因此,所有解析的字符串都只在一列中发布或显示,因为我希望它每1个解析的字符串显示1列。现在我的问题是我有一个字符串,它用逗号分隔了3个第一个字符串,但其余的没有用逗号分隔,而是我必须用正则表达式来解析它。是否有一种方法可以解析并返回每列一个结果,还可以使用逗号分隔的方法和正则表达式进行解析 这是我的解析代码 USE [SMSGPS] GO /****** Object: UserD

我以前在这里发布过关于使用mssql解析的文章,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
当我使用上面的代码和下面的代码时,它只在一列中返回结果,我希望每列显示一个结果

下面是我如何调用函数的

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个字符串,然后复制其余的字符串 351856040489593241111;1R,141119040115,A,1422.1425N,12103.1746E,0.0151,1.80100006

如你所见,它的结尾有逗号。但是当我使用下面的字符串时 351856045173481,RA1;1000V1430.4358N1210.0132E000.0170.601.0000-600202221114CEA112018613D000000,,,,,,,,,

现在我被困在这里将近4天了,我需要所有能得到的帮助。提前感谢大家的帮助。我真的很感谢大家

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

这是一个字符串,它在结尾处没有逗号分隔


如果列数未知,我会这样做。我将您的
ufn
更改为有一个标识列,以后可以使用该标识列来结果集。如果列未知,则必须在动态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
');

预期的结果是什么?结果可能会有所不同,因为字符串本身不是常量…但是关于常量结果,附加的第一个结果pic是我想要的结果,但不是在1列中,我希望每列有一个结果。
1000V1430.4358N12100.0132E000.0170.601.0000-600202221114CEA112018613D000000
1000 V 1430.4326N 12100.0162E 000.03 42.20 2.0000 90027 0923111 4D 3A 3 120019815 1000000我放置了空格在与上述结果不同的结果之间,您的意思是您希望一行有1000个?V在另一个1430在另一个?还是都在同一排?