0

SELECT の後、次のような値を取得しています。

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

次のように2つの列に分割したい:

    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: -間に 4 つのスペースを入れる

4

1 に答える 1

0

これはサンプルで問題なく機能しますが、実際のデータに対してテストする必要があります。

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

修正が必要な場合は、追加のサンプルで質問を更新してください。

于 2013-10-21T10:41:37.510 に答える