2017-06-26 88 views
0

我有一個字符串/文本元素,我需要拆分並插入到表中。SQL Server將字符串值拆分成行和列並插入表

我有

123456|House,123567|Flat,789463|Car,635491|Lorry, 

凡數值(n值)需要在第一列去文本值,類型如。衆議院需要在第二。

「,」之前的值需要在同一行上。我要尋找一個類似表

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

我試圖使用SQL代碼

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

但我的運氣不好。

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

+0

的SQL Server 2016具有分割功能來做到這一點。 –

回答

0

您可以使用split()從網絡或SQL Server 2016之後:

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; 
1

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

在SQL Server預-2016,採用由Jeff MODEN與left()stuff()(或right())沿CSV分路器表值函數charindex()

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 | 
+--------+-------+ 

拆分字符串參考:

0

使用SUBSTRING(),XML和跨應用,我們可以得到想要的結果

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 | 
+--------+-------+ 
+0

我正在使用SQL Server 2012(抱歉應該提到那個),但是這個工作非常好。唯一的問題是我無法將值添加到數據庫resultsTable。 你知道我怎麼能把結果放到一個特定的SQL表中。 我試過 插入resultsTable(n值,類型) 值(n值,【類型】) ,但它只是拍攝出一個錯誤 – Phil

+0

我設法加入「INSERT INTO resultsTable」得到這個工作 更改代碼看起來像 「CROSS APPLY Value.nodes( '/ S')AS斯普利特(一) ) INSERT INTO Missed_Collective_Events SELECT * FROM (」 – Phil

相關問題