我之前发布过使用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天了,我需要得到所有帮助。提前感谢大家的帮助。我真的非常感谢你们所有人。
第一件事的结果是这样的(逗号分隔到结尾)
这是直到结尾才用逗号分隔的字符串
答案 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
');