当前位置: 代码迷 >> Sql Server >> 一个字符串拆分到多行?(求改善!)
  详细解决方案

一个字符串拆分到多行?(求改善!)

热度:87   发布时间:2016-04-27 12:09:13.0
一个字符串拆分到多行?(求改进!)
SQL code
/*现在有一个长字符串(长度为444,264,676)(分割标识符为:<?XML ),我想将它分割到多行(最终结果大概5000行左右).我用了下面这个方法,虽然结果正确,但是很费时(约2个小时)。请问有什么其他效率高的方法吗?谢谢各位大侠!*/        declare @doc varchar(max),@Stop bit,@xml varchar(max),@pos int,@PrePos int,@i int    select @doc=BulkColumn from Table_2011 --原有字符串所在表    select @Stop =1, @i=1, @PrePos=0,@Pos=0    while @Stop=1    begin        set @[email protected][email protected]        set @pos=patindex('%<?xml%',right(@doc,len(@doc)[email protected]))          if @pos=0        begin            select @xml =substring(@doc,@prepos,LEN(@DOC)[email protected])            set @Stop =0        end        else        begin            set @xml =substring(@doc,@prepos,@pos)        end                                       insert into Final_Table values (@i,@xml)--写入到新表        set @[email protected]+1                         end


------解决方案--------------------
try
SQL code
DECLARE @one Table(        CompanyID INT,        CompanyCodes VARCHAR(100) )  insert into @one select 1,'1<?xml2' union all select 2,'1<?xml2<?xml3' union all select 3,'1<?xml2<?xml3<?xml4'union all select 4,'1<?xml2<?xml3<?xml4<?xml5';WITH cte AS (     SELECT         CompanyID,         CAST('<i>' + REPLACE(CompanyCodes, '<?xml', '</i><i>') + '</i>' AS XML) AS CompanyCodes     FROM @one ) SELECT     CompanyID,     x.i.value('.', 'VARCHAR(10)') AS CompanyCode FROM cte CROSS APPLY CompanyCodes.nodes('i') x(i)
------解决方案--------------------
try this,
SQL code
declare @x varchar(500)select @x='1<?XML2<?XML3<?XML4<?XML5'select substring(a.x,b.number,charindex('<?XML',a.x+'<?XML',b.number)-b.number) xfrom (select @x x) ainner join master.dbo.spt_values bon b.[type]='P' and substring('<?XML'+a.x,b.number,5)='<?XML'/*x------------------12345(5 row(s) affected)*/
------解决方案--------------------
SQL code
DECLARE @s VARCHAR(1000), @xml xml;SET @s = '1<?xml2<?xml3<?xml4<?xml5' ;SET @xml = CAST('<x>' + REPLACE(@s, '<?xml', '</x><x>') + '</x>' AS XML)SELECT T.c.value('(.)[1]','varchar(10)')--INTO #tFROM @xml.nodes('x') T(c)
------解决方案--------------------
SQL code
create table #t(value int)godeclare @str varchar(max)set @str='1<?XML2<?XML3<?XML4<?XML5<?XML6<?XML7<?XML8<?XML9'select @str='insert #t select '+REPLACE(@str,'<?XML',' union all '+CHAR(10)+' select ')exec(@str)select * from #t/*value123456789*/
  相关解决方案