SQL Server将字符串值拆分为行和列并插入表中

时间:2017-06-26 11:44:20

标签: sql sql-server

我有一个字符串/文本元素,我需要拆分并插入表格。

我有

的文字值
123456|House,123567|Flat,789463|Car,635491|Lorry,

数值(nvalue)需要进入第一列,类型如何。众议院需要排在第二位。

“,”之前的值需要在同一行。我会找一张类似

的桌子
╔══════════╦═══════════╗
║ nvalue   ║ Type      ║
╠══════════╬═══════════╣
║   123456 ║     House ║
║   123567 ║      Flat ║
║   789463 ║       Car ║
║   635491 ║     Lorry ║
╚══════════╩═══════════╝

我正在尝试使用SQL代码

INSERT INTO TABLE resultsTable
SELECT 
nvalue({status}, ';')[255],
type({status}| ';')[255],

但我没有运气。

{status}是字符串所在的文本字段。

3 个答案:

答案 0 :(得分:1)

在SQL Server 2016+中,您可以使用string_split()

在2016年之前的SQL Server中,使用由Jeff Moden和left()以及stuff()(或right())与charindex()的CSV Splitter表值函数:

declare @status nvarchar(max) = '123456|House,123567|Flat,789463|Car,635491|Lorry,'

select 
    nvalue = left(s.Item,charindex('|',s.Item)-1)
  , [Type] = stuff(s.Item,1,charindex('|',s.Item),'')
from dbo.DelimitedSplitN4K(@status,',') s
where s.Item <>''

rextester演示:http://rextester.com/QQZUC78477

返回:

+--------+-------+
| nvalue | Type  |
+--------+-------+
| 123456 | House |
| 123567 | Flat  |
| 789463 | Car   |
| 635491 | Lorry |
+--------+-------+

拆分字符串参考:

答案 1 :(得分:0)

您可以从网络或SQL Server 2016中使用split()。然后:

with lines(line) as (
      select l.*
      from dbo.split(@str, '|') l
     )
insert into resultsTable (nvalue, type)
    select left(line, charindex(',', line) - 1),
           stuff(line, charindex(',', line), len(line), '')
    from lines;

答案 2 :(得分:0)

使用SUBSTRING(),Xml和Cross应用我们可以获得所需的结果

DECLARE @Value NVARCHAR(max) = ',123456|House,123567|Flat,789463|Car,635491|Lorry,'
DECLARE @DYVALUE TABLE (VALUE NVARCHAR(MAX))

INSERT INTO @DYVALUE (VALUE)
SELECT @VALUE

;WITH cte
AS (
    SELECT Split.a.value('.', 'VARCHAR(1000)') AS Value
    FROM (
        SELECT CAST('<S>' + REPLACE(Value, ',', '</S><S>') + '</S>' AS XML) AS Value
        FROM @DyValue
        ) AS A
    CROSS APPLY Value.nodes('/S') AS Split(a)
    )
SELECT *
FROM (
    SELECT SUBSTRING(Value, 0, CHARINDEX('|', Value)) AS nvalue
        ,SUBSTRING(Value, CHARINDEX('|', Value) + 1, LEN(Value)) AS [Type]
    FROM Cte
    ) DT
WHERE nvalue <> ''
    AND [Type] <> ''

结果:

+--------+-------+
| nvalue | Type  |
+--------+-------+
| 123456 | House |
| 123567 | Flat  |
| 789463 | Car   |
| 635491 | Lorry |
+--------+-------+