Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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 如何将字符串拆分为多列,然后再拆分为多行_Sql_String - Fatal编程技术网

Sql 如何将字符串拆分为多列,然后再拆分为多行

Sql 如何将字符串拆分为多列,然后再拆分为多行,sql,string,Sql,String,我有一个过程,它返回一个字符串,如下所示 <USAGESTARTT=1387847400,USAGEENDT=1387849200,EVENTCOUNT=8,EVENTDURATION=247996,DISKSPACEUSED=0,BANDWIDTHOUT=0,BANDWIDTHCDN=0,HOURSUSED=0,AMOUNT=41332.66,RECYCLED_AMOUNT=0,NUM_RECYCLED_CDR=0,PROCESS_NAME=CP_RAX_RAT_SUSP,SERVICE

我有一个过程,它返回一个字符串,如下所示

<USAGESTARTT=1387847400,USAGEENDT=1387849200,EVENTCOUNT=8,EVENTDURATION=247996,DISKSPACEUSED=0,BANDWIDTHOUT=0,BANDWIDTHCDN=0,HOURSUSED=0,AMOUNT=41332.66,RECYCLED_AMOUNT=0,NUM_RECYCLED_CDR=0,PROCESS_NAME=CP_RAX_RAT_SUSP,SERVICE_TYPE=CLOUD_BKUP>,<USAGESTARTT=0,USAGEENDT=1386032400,EVENTCOUNT=8,EVENTDURATION=74262,DISKSPACEUSED=0,BANDWIDTHOUT=0,BANDWIDTHCDN=0,HOURSUSED=0,AMOUNT=99.02,RECYCLED_AMOUNT=0,NUM_RECYCLED_CDR=0,PROCESS_NAME=CP_RAX_RAT_SUSP,SERVICE_TYPE=CLOUD_SRVR_UPTIME>,
这实际上是一组由两行相互连接的数据集。就个人而言,他们看起来像

字符串1

<USAGESTARTT=1387847400,USAGEENDT=1387849200,EVENTCOUNT=8,EVENTDURATION=247996,DISKSPACEUSED=0,BANDWIDTHOUT=0,BANDWIDTHCDN=0,HOURSUSED=0,AMOUNT=41332.66,RECYCLED_AMOUNT=0,NUM_RECYCLED_CDR=0,PROCESS_NAME=CP_RAX_RAT_SUSP,SERVICE_TYPE=CLOUD_BKUP>,
字符串2

<USAGESTARTT=0,USAGEENDT=1386032400,EVENTCOUNT=8,EVENTDURATION=74262,DISKSPACEUSED=0,BANDWIDTHOUT=0,BANDWIDTHCDN=0,HOURSUSED=0,AMOUNT=99.02,RECYCLED_AMOUNT=0,NUM_RECYCLED_CDR=0,PROCESS_NAME=CP_RAX_RAT_SUSP,SERVICE_TYPE=CLOUD_SRVR_UPTIME>,
我的要求是首先将此字符串拆分为不同的行,然后将每行拆分为多个列,“=”之前的字符串是列名,“=”之后的字符串是需要插入列中的值。例如:-字符串“USAGESTARTT=0”中的USAGESTARTT是列名,0是USAGESTARTT列中的值。本例仅显示了两行,但我的过程可以返回彼此连接的多行


您能为这个要求提供一个解决方案吗?

我使用这个TVF来分割字符串:

CREATE function dbo.split (@value varchar(8000),@delim varchar(8000))
returns table
as
return
(
select d.value,
       d.orders,
       ivalue = convert(int, case when isnumeric(d.value)=1 and d.value not like '%[^0-9 +-]%' and len(replace(replace(replace(d.value,' ',''),'-',''),'+',''))<=10 then case when convert(bigint,d.value) between -2147483648 and 2147483647 then d.value end end)

    from
        (
            select   
                    value= replace(substring(value,
                                            idx,
                                            case when cnt>=0 then cnt end 
                                         )
                                 ,char(1),'')
                    ,orders=( datalength(left(value,idx-1))-datalength(replace(left(value,idx-1),@delim,''))
                            )/datalength(@delim)
                from (
                       select number
                             ,idx
                             ,cnt = charindex(@delim,value, number + 1) - number - datalength(@delim)
                             ,value 
                          from 
                                (
                                   select number
                                         ,idx = number + datalength(@delim)
                                         ,value = (select @delim+char(1)+@value+char(1)+@delim)
                                      from dbo.s_value
                                        where number between 1 and datalength( (select @delim+char(1)+@value+char(1)+@delim) ) - datalength(@delim)

                                ) t            
                          where substring(t.value, number, datalength(@delim)) = @delim         
                     ) t             
       ) d          
)

GO
这样使用它:

select * from dbo.split(@YOUR_STRING,'>,<')

如果您使用的是SQL Server,则可以将字符串放入XML类型的变量中,然后解析此XML,请参见示例。

您尝试了什么?当然,在SQL中拆分字符串已经做了数千次了,并且可以在web上搜索。StackOverflow用于解决编写/运行代码时遇到的特定问题。