在sql server 2008中拆分两个分隔符char的函数 [英] Split function for two delimiter char in sql server 2008

查看:90
本文介绍了在sql server 2008中拆分两个分隔符char的函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有存储过程,它将输入作为包含网格视图记录的字符串。行由...确定;分离器&列由分隔符标识。样本字符串数据



  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆