在sql server 2008中拆分两个分隔符char的函数 [英] Split function for two delimiter char in sql server 2008
问题描述
我有存储过程,它将输入作为包含网格视图记录的字符串。行由...确定;分离器&列由分隔符标识。样本字符串数据
T001 , 20 Sep 2015 ,2015年9月20日 22:00:00 ,9/20/2015 23:00:00; T002, 20 Sep 2015 ,2015年9月20日 22:00:00 ,9 / 21/2015 06:00:00; T003, 20 Sep 2015 ,2015年9月21日 01:00:00 ,2015年9月21日 06:00 :00
我正在使用分割功能(参考 http://www.aspdotnet-suresh.com/2013/07/sql-server-split-fu nction-example-in.html [ ^ ]和 http://www.aspsnippets.com/Articles/Split-function-in-SQL-Server-Example-函数 - 分割 - 逗号分隔 - 分隔 - 在SQL-Server-2005-2008-and-2012.aspx中的字符串 [ ^ ]但这适用于Single Delimiter char。
使用
SELECT * FROM dbo.Split( @ s ,' ;')
我有3行作为
T001 , 20 Sep 2015 ,9 / 20/2015 22:00:00 ,9/20/2015 23:00:00;
T002 , 20 Sep 2015 ,2015年9月20日 22:00:00 ,9/21/2015 06:00: 00;
T003 , 20 Sep 2015 ,2015年9月21日 01:00:00 ,2015年9月21日 06:00:00
现在我想再次拆分,分隔符。那么如何将它用于两个分隔符char。
提前谢谢......
< blockquote>你好Umesh
AS告诉你你先分割所有记录并得到这样的输出
T001 , 20 Sep 2015 ,2015年9月20日 22:00:00 ,9/20/2015 23:00:00;
T002 , 20 Sep 2015 ,2015年9月20日 22:00:00 ,9/21/2015 06:00: 00;
T003 , 20 Sep 2015 ,2015年9月21日 01:00:00 ,2015年9月21日 06:00:00
所以这个拆分数据存储在临时表中并在拆分后临时表数据逐行
i希望通过使用这个你得到你的解决方案!
它可以这样做。而不是在一个查询中使用两个分隔符,您可以将它用于两个地方。
CREATE 功能 [dbo]。 [SPLIT]
( @ DELIMITER VARCHAR ( 5 ),
@ LIST VARCHAR (MAX)
)
RETURNS @ TABLEOFVALUES TABLE
(ROWID SMALLINT IDENTITY ( 1 , 1 ),
[VALUE] VARCHAR (MAX)
)
AS
BEGIN
DECLARE @ LENSTRING INT
WHILE LEN( @ LIST )> 0
BEGIN
SELECT @ LENSTRING =
( CASE CHARINDEX( @ DELIMITER , @ LIST )
WHEN < span class =code-digit> 0 那么 LEN( @ LIST )
ELSE (CHARINDEX( @ DELIMITER , @ LIST ) - 1)
END
)
INSERT INTO @ TABLEOFVAL UES
SELECT SUBSTRING( @ LIST , 1 , @ LENSTRING )
SELECT < span class =code-sdkkeyword> @ LIST =
( CASE (LEN( @列表) - @ LENSTRING )
WHEN 0 那么 ' '
ELSE RIGHT ( @ LIST ,LEN( @ LIST ) - @ LENSTRING - 1 )
END
)
END
RETURN
END
GO
然后创建一个临时表或表变量来存储输出以进一步拆分。
声明 @ Outputval as nvarchar (max)
CREATE table #temptable
(
RowID int ,
OutputVal nvarchar (max)
)
将 插入 #temptable
选择 * 来自 dbo.SPL IT(' ;',' < span class =code-string> T001,20 Sep 2015,9 / 20/2015 22:00:00,9 / 20/2015 23:00:00; T002,20 Sep 2015 2015/9/2015 22: 00:00,9 / 21/2015 06:00:00; T003,209 2015年9月9/21/2015 01:00:00,9 / 21/2015 06:00:00')
选择 @ Outputval = OutputVal 来自 #temptable
选择 * 来自 dbo.SPLIT(< span class =code-string>' ,', @ Outputval )
查询可以更简化,我只想给你一个想法。
谢谢
I have Stored Procedure that takes input as string containing Grid view records. Rows are identified by ; separator & columns are identified by , separator. Sample string data
T001,20 Sep 2015,9/20/2015 22:00:00,9/20/2015 23:00:00;T002,20 Sep 2015,9/20/2015 22:00:00,9/21/2015 06:00:00;T003,20 Sep 2015,9/21/2015 01:00:00,9/21/2015 06:00:00
I am using Split Function (refer http://www.aspdotnet-suresh.com/2013/07/sql-server-split-function-example-in.html[^] and http://www.aspsnippets.com/Articles/Split-function-in-SQL-Server-Example-Function-to-Split-Comma-separated-Delimited-string-in-SQL-Server-2005-2008-and-2012.aspx[^] But that works on Single Delimiter char.
using
SELECT * FROM dbo.Split(@s, ';')
I got 3 rows as
T001,20 Sep 2015,9/20/2015 22:00:00,9/20/2015 23:00:00;
T002,20 Sep 2015,9/20/2015 22:00:00,9/21/2015 06:00:00;
T003,20 Sep 2015,9/21/2015 01:00:00,9/21/2015 06:00:00
Now i want to split again by , separator. So how to use this for two delimiter char.
Thanks in advance......
Hi Umesh
AS per told you you split first all records and get output like this
T001,20 Sep 2015,9/20/2015 22:00:00,9/20/2015 23:00:00; T002,20 Sep 2015,9/20/2015 22:00:00,9/21/2015 06:00:00; T003,20 Sep 2015,9/21/2015 01:00:00,9/21/2015 06:00:00
so this split data store in temp table and after split this temp table data row by row
i hope by using this you will get your solution!
It can be do it that way. instead of using two delimiter in one query you can use it into two places.
CREATE FUNCTION [dbo].[SPLIT] ( @DELIMITER VARCHAR(5), @LIST VARCHAR(MAX) ) RETURNS @TABLEOFVALUES TABLE ( ROWID SMALLINT IDENTITY(1,1), [VALUE] VARCHAR(MAX) ) AS BEGIN DECLARE @LENSTRING INT WHILE LEN( @LIST ) > 0 BEGIN SELECT @LENSTRING = (CASE CHARINDEX( @DELIMITER, @LIST ) WHEN 0 THEN LEN( @LIST ) ELSE ( CHARINDEX( @DELIMITER, @LIST ) -1 ) END ) INSERT INTO @TABLEOFVALUES SELECT SUBSTRING( @LIST, 1, @LENSTRING ) SELECT @LIST = (CASE ( LEN( @LIST ) - @LENSTRING ) WHEN 0 THEN '' ELSE RIGHT( @LIST, LEN( @LIST ) - @LENSTRING - 1 ) END ) END RETURN END GO
And then create a temp table or table variable to store the output to further split.
Declare @Outputval as nvarchar(max) CREATE table #temptable ( RowID int, OutputVal nvarchar(max) ) Insert into #temptable select * from dbo.SPLIT(';','T001,20 Sep 2015,9/20/2015 22:00:00,9/20/2015 23:00:00;T002,20 Sep 2015,9/20/2015 22:00:00,9/21/2015 06:00:00;T003,20 Sep 2015,9/21/2015 01:00:00,9/21/2015 06:00:00') select @Outputval = OutputVal from #temptable select * from dbo.SPLIT(',', @Outputval)
Query can be more simplify, i just try to give you idea.
Thanks
这篇关于在sql server 2008中拆分两个分隔符char的函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!