如何将多行字符串拆分为tsql中的列

rgh*_*rgh 7 sql t-sql sql-server sql-server-2008

我有一个数据库字段,其中包含存储为多行字符串的地址信息.

88 Park View
Hemmingdale
London
Run Code Online (Sandbox Code Playgroud)

谁能告诉我将第1行,第2行和第3行作为select语句中的不同字段的最佳方法?

关心理查德

Kaf*_*Kaf 6

尝试这样的事情?请注意,这有点脆弱

DECLARE @S VARCHAR(500), @Query VARCHAR(1000)
SELECT @S='88 Park View
           Hemmingdale
           London'

SELECT @Query=''''+ REPLACE(@S, CHAR(13),''',''')+''''
EXEC('SELECT '+@Query)
Run Code Online (Sandbox Code Playgroud)

结果

88 Park View | Hemmingdale | London
Run Code Online (Sandbox Code Playgroud)


Jer*_*ose 5

这是我想到的一种解决方案,它使用CTE来递归地迭代一个值表,并用新行将其拆分CHAR(13),然后使用a PIVOT来显示结果。您可以将其扩展到其他列(超过5列),只需将其添加到中即可PIVOT

DECLARE @Table AS TABLE(ID int, SomeText VARCHAR(MAX))

INSERT INTO @Table VALUES(1, '88 Park View
Hemmingdale
London')

INSERT INTO @Table VALUES(2, '100 Main Street
Hemmingdale
London')

INSERT INTO @Table VALUES(3, '123 6th Street
Appt. B
Hemmingdale
London')

;WITH SplitValues (ID, OriginalValue, SplitValue, Level)
AS
(
    SELECT  ID, SomeText, CAST('' AS VARCHAR(MAX)), 0 FROM @Table

    UNION ALL

    SELECT  ID
    ,   SUBSTRING(OriginalValue, CASE WHEN CHARINDEX(CHAR(13), OriginalValue) = 0 THEN LEN(OriginalValue) + 1 ELSE CHARINDEX(CHAR(13), OriginalValue) + 2 END, LEN(OriginalValue))
    ,   SUBSTRING(OriginalValue, 0, CASE WHEN CHARINDEX(CHAR(13), OriginalValue) = 0 THEN LEN(OriginalValue) + 1 ELSE CHARINDEX(CHAR(13), OriginalValue) END)
    ,   Level + 1
    FROM    SplitValues
    WHERE   LEN(SplitValues.OriginalValue) > 0
)

SELECT  ID, [1] AS Level1, [2] AS Level2, [3] AS Level3, [4] AS Level4, [5] AS Level5
FROM    (
    SELECT  ID, Level, SplitValue
    FROM    SplitValues
    WHERE   Level > 0
    ) AS p
PIVOT   (MAX(SplitValue) FOR Level IN ([1], [2], [3], [4], [5])) AS pvt
Run Code Online (Sandbox Code Playgroud)

结果:

ID          Level1               Level2               Level3               Level4               Level5
----------- -------------------- -------------------- -------------------- -------------------- --------------------
1           88 Park View         Hemmingdale          London               NULL                 NULL
2           100 Main Street      Hemmingdale          London               NULL                 NULL
3           123 6th Street       Appt. B              Hemmingdale          London               NULL
Run Code Online (Sandbox Code Playgroud)