2016-11-09 4 views
-1

У меня есть столбец, который имеет такие значения, как этоРазбиение текста в SQL Server 2008

"BEAAL - Aalter - Belgium - EMEA" 

Я хочу, чтобы создать таблицу, где я хочу, чтобы разбить его в несколько колонок

  • Местонахождение = BEAAL - Аалтер
  • Страна = Бельгия
  • область = ЕМЕА

Так что мой стол должен выглядеть следующим образом

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

Как это может быть достигнуто в SQL Server 2008? У меня около 1000 записей в таблице, чтобы разбить этот путь.

+0

Nothing доступны при поиске 'SQL Server 2008 разделенного текст'? – dfundako

+0

Это довольно легко, если структура фиксирована (что означает, что первая и вторая части всегда расположены, третье - это страна, а четвертая - всегда область). Посмотрите на разделение строк в документации сервера sql. –

ответ

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; 

Результат:

╔════╦═════════════════╦═════════╦════════╗ 
║ id ║ Location  ║ Country ║ Region ║ 
╠════╬═════════════════╬═════════╬════════╣ 
║ 1 ║ BEAAL - Aalter ║ Belgium ║ EMEA ║ 
║ 2 ║ YYYY - Gent  ║ Belgium ║ XXXX ║ 
║ 3 ║ ZZZZZ - Brussel ║ Belgium ║ WWWWW ║ 
╚════╩═════════════════╩═════════╩════════╝ 
Смежные вопросы