2016-11-09 88 views
-1

我有擁有這樣的價值觀列拆分文本2008

"BEAAL - Aalter - Belgium - EMEA" 

我想創建一個表,我想它拆分到多個列

  • 位置= BEAAL - 阿爾特爾
  • 國家=比利時
  • 地區= EMEA

所以我的表應該看起來像這樣

'ID' 'Text'     'Location'    'Country' 'Region' 
'1 ' 'BEAAL - Aalter'   'BEAAL - Aalter'   'Belgium' 'EMEA' 

這怎麼能在SQL Server 2008中實現?我在表中有大約1000個條目以這種方式分割。

+0

什麼都沒有? – dfundako

+0

如果結構是固定的(這意味着第一個和第二個部分總是位置,第三個始終是國家和地區始終是區域),這相當容易。在sql server文檔中查找字符串拆分。 –

回答

0

此腳本使用SplitStrings函數的稍微修改版本生成您想要的內容,可以在this answer中找到。所有功勞歸功於Aaron Bertrand

修改SplitStrings功能:

CREATE FUNCTION [dbo].[SplitStrings](@List NVARCHAR(MAX)) 
RETURNS TABLE 
AS 
    RETURN (SELECT Item=LTRIM(RTRIM(Item)),Id FROM 
     (SELECT Item = x.i.value('(./text())[1]', 'nvarchar(max)'),Id=x.i.value('for $i in . return count(../*[.<<$i])+1','INT') 
     FROM (SELECT [XML] = CONVERT(XML, '<i>' 
     + REPLACE(@List, '-', '</i><i>') + '</i>').query('.') 
      ) AS a CROSS APPLY [XML].nodes('i') AS x(i)) AS y 
     WHERE Item IS NOT NULL 
    ); 

腳本:

DECLARE @t TABLE(id int identity(1,1), blabla VARCHAR(512)); 
INSERT INTO @t(blabla)VALUES('BEAAL - Aalter - Belgium - EMEA'); 
INSERT INTO @t(blabla)VALUES('YYYY - Gent - Belgium - XXXX'); 
INSERT INTO @t(blabla)VALUES('ZZZZZ - Brussel - Belgium - WWWWW'); 

SELECT 
    t.id, 
    Location=MAX(CASE WHEN split.Id=1 THEN split.Item END)+' - '+MAX(CASE WHEN split.Id=2 THEN split.Item END), 
    Country=MAX(CASE WHEN split.Id=3 THEN split.Item END), 
    Region=MAX(CASE WHEN split.Id=4 THEN split.Item END) 
FROM 
    @t AS t 
    CROSS APPLY dbo.SplitStrings(blabla) AS split 
GROUP BY 
    t.Id; 

結果:可當你搜索 'SQL Server 2008中拆分文本'

╔════╦═════════════════╦═════════╦════════╗ 
║ id ║ Location  ║ Country ║ Region ║ 
╠════╬═════════════════╬═════════╬════════╣ 
║ 1 ║ BEAAL - Aalter ║ Belgium ║ EMEA ║ 
║ 2 ║ YYYY - Gent  ║ Belgium ║ XXXX ║ 
║ 3 ║ ZZZZZ - Brussel ║ Belgium ║ WWWWW ║ 
╚════╩═════════════════╩═════════╩════════╝