Результат:

от вопрос уже есть ответ здесь:

Функция с разделителями в SQL для разделения данных между точкой с запятой 2 ответаПревращение разделенной запятой строки в отдельные строки 14 ответов

У меня есть вход, как это-

select ID,FIELD from TABLE

1| A,B,C,D
2|X,Y,Z

Вывод как это-

SELECT ID,FIELD from TABLE

1|A
1|B
1|C
1|D
2|X
2|Y
2|Z

Может кто-нибудь, пожалуйста, помогите мне, как я могу сделать это в SQL Server 2014 простым способом?

 jarlh05 сент. 2017 г., 09:30
Не повезло, вы должны убрать чей-то неудачный выбор, чтобы хранить данные как разделенные запятыми элементы ...
 jarlh05 сент. 2017 г., 09:32
Кстати, поле очень плохое имя столбца.
 Harsh Tiwari06 сент. 2017 г., 00:37
Я использовал Field только в качестве примера, само поле не имеет этого имени :)

Ответы на вопрос(2)

Вы можете выбрать функцию разделения строк из Аарона БертранСплит струны правильный путь - или следующий лучший путьи использовать его сcross apply выбрать данные из вашей таблицы. Для этой демонстрации я выбрал функцию разделения строк XML.
Итак, сначала создайте функцию:

CREATE FUNCTION dbo.SplitStrings_XML
(
   @List       NVARCHAR(MAX),
   @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
   RETURN 
   (  
      SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
      FROM 
      ( 
        SELECT x = CONVERT(XML, '<i>' 
          + REPLACE(@List, @Delimiter, '</i><i>') 
          + '</i>').query('.')
      ) AS a CROSS APPLY x.nodes('i') AS y(i)
   );
GO

Тогда все, что вам нужно сделать, это что-то вроде этого:

SELECT ID, Item
FROM TABLE
CROSS APPLY
dbo.SplitStrings_XML(FIELD, ',')

Смотрите живое демо на rextester.

Кроме того, вам следует прочитатьДействительно ли плохо хранить список с разделителями в столбце базы данных?, где вы увидите много причин, почему ответ на этот вопросАбсолютно да!

 Harsh Tiwari06 сент. 2017 г., 00:37
Спасибо за усилия, приятель, но это не сработает. Не уверен почему
 Zohar Peled06 сент. 2017 г., 07:17
Что вы имеете в виду немного не работает? Вы получили ошибку? Вы получили неправильные результаты?Я проверил ваши образцы данных на rextester и мне кажется, что это работает просто отлично.

Вам следуетXML С участиемCROSS APPLY нет необходимости явноFunction :

SELECT ID,
       split.a.value('.', 'NVARCHAR(MAX)') [FIELD]
FROM
(
    SELECT ID,
           CAST('<M>'+REPLACE([Field], ',', '</M><M>')+'</M>' AS XML) AS String
    FROM #TM
) AS a
CROSS APPLY String.nodes('/M') AS split(a);

Результат:

ID FIELD
1  A
1  B
1  C
1  D
2  X
2  Y
2  Z

Ваш ответ на вопрос