2013-10-21 85 views
0

一个SELECT我收到值这样的后:SQL换行符根据病情

Basic:   3 Years/36,000 Miles Drivetrain:   3 Years/36,000 Miles Corrosion:   6 Years/100,000 Miles Roadside Assistance:   3 Years/36,000 Miles 

我希望它在两列拆分,如:

Text   Value 

    Basic  3 Years/36,000 Miles 
    Drivetrain 3 Years/36,000 Miles 

etc 

注:

Basic:-----------3 Years/36,000 Miles- 之间有11个空格

3 Years/36,000 Miles----Drivetrain: - 有在

+0

你的表的模式是什么,你可以提供select语句吗? –

+0

'SELECT Text FROM Info' - Text的数据类型是'ntext' - 这里给出了一个我用空格说的长行.. – James

+0

使用http://sqlfiddle.com发布你的表和数据 – Tarik

回答

0

之间的正常工作与你的样品4个空格,但你必须要测试它针对真实的数据是肯定的。

WITH CTE_StringSplit AS 
(
    SELECT CAST(NULL AS NVARCHAR(MAX)) AS [Text], CAST(NULL AS NVARCHAR(MAX)) AS [Value] , CAST([Text] AS NVARCHAR(MAX)) AS RemainingText 
    FROM Info 
    UNION ALL 
    SELECT 
     SUBSTRING(RemainingText,0,CHARINDEX('   ',RemainingText)) 
     ,LTRIM(SUBSTRING(RemainingText,CHARINDEX('   ',RemainingText),CASE WHEN CHARINDEX(' ',LTRIM(SUBSTRING(RemainingText,CHARINDEX('   ',RemainingText),DATALENGTH(RemainingText)))) > 0 THEN CHARINDEX(' ',LTRIM(SUBSTRING(RemainingText,CHARINDEX('   ',RemainingText),DATALENGTH(RemainingText)))) ELSE DATALENGTH(RemainingText) END + 11)) 
     ,LTRIM(SUBSTRING(RemainingText,11 + CHARINDEX('   ',RemainingText) + CASE WHEN CHARINDEX(' ',LTRIM(SUBSTRING(RemainingText,CHARINDEX('   ',RemainingText),DATALENGTH(RemainingText)))) > 0 THEN CHARINDEX(' ',LTRIM(SUBSTRING(RemainingText,CHARINDEX('   ',RemainingText),DATALENGTH(RemainingText)))) ELSE DATALENGTH(RemainingText) END,DATALENGTH(RemainingText))) 
    FROM CTE_StringSplit 
    WHERE LEN(RemainingText)>0 
) 
SELECT [Text],[Value] 
FROM CTE_StringSplit 
WHERE [Text] IS NOT NULL 

请更新与额外的样品问题,如果需要更正。