2017-01-24 4 views
1

У меня есть строкаРазбираем запятыми строку на несколько строк

('emp_id="123",emp_status="New Hire",emp_name="Smith, John A",emp_salary="2000",emp_state="VA"') 

Как разделить это в

Column Name Value 
emp_id  123 
emp_status New Hire 
emp_name  Smith, John A (Note: This has a comma within the string) 
emp_salary 2000 
emp_state VA 
+4

Возможный дубликат [Превращение Comma разлуки строки в отдельные строки] (http://stackoverflow.com/questions/5493510/turning-a-comma-separated-string-into-individual-rows) – Prisoner

+0

Плюс, в этом вопросе нет реальной попытки решения. Если вы не собираетесь выступать, ничего не ожидайте. –

+0

Лучше всего использовать * not * использовать значения, разделенные somma, использовать таблицу «многие-ко-многим» или TVP. SQL Server 2016 добавил команду [STRING_SPLIT] (https://msdn.microsoft.com/en-us/library/mt684588.aspx) как удобство, которое нельзя злоупотреблять. –

ответ

1

Один из способов решить эту проблему использует рекурсивный КТР. Это, вероятно, не самый быстрый способ, но это самый простой способ я нашел в этой конкретной ситуации:

DECLARE @Source varchar(200) = 'emp_id="123",emp_status="New Hire",emp_name="Smith, John A",emp_salary="2000",emp_state="VA"' 

;WITH CTE AS 
(
    SELECT LEFT(@Source, CHARINDEX('",', @Source)) as val, 
      RIGHT(@Source, LEN(@Source) - CHARINDEX('",', @Source)-1) as string 

    UNION ALL 

    SELECT CASE WHEN CHARINDEX('",', string) > 0 THEN 
       LEFT(String, CHARINDEX('",', string)) 
      ELSE 
       String 
      END as val, 
      CASE WHEN CHARINDEX('",', string) > 0 THEN 
       RIGHT(string, LEN(string) - CHARINDEX('",', string)-1) 
      ELSE 
       '' 
      END as string 
    FROM CTE 
    WHERE LEN(string) > 0 
) 

SELECT LEFT(val, CHARINDEX('=', val)-1) As [Column Name], 
     REPLACE(RIGHT(val, LEN(val) - CHARINDEX('=', val) -1), '"', '') As Value 
FROM CTE 

Результаты:

Column Name  Value 
emp_id   123 
emp_status  New Hire 
emp_name  Smith, John A 
emp_salary  2000 
emp_state  VA 
+0

Спасибо, Зоар. Кажется, что он работает, но не анализирует, если значение после знака = не заключает двойные кавычки din. Ex :('emp_reg_num = 888, emp_status = "New Hire", emp_name = "Smith, John A", emp_salary = "2000 ", emp_state =" VA ") –

+0

Он не анализирует значения, не заключенные в двойные кавычки, если они находятся в начале строки или в середине строки или в конце строки –

+0

Не было такого значения в ваших данных образца. –

Смежные вопросы