Разделить строку на таблицу по заданному разделителю строки и столбцу в SQL-сервере

Как разбить строку, содержащую матрицу в таблицу в SQL Server? Строка имеет столбцы и разделители строк.

Предположим, у меня есть строка:

declare @str varchar(max)='A,B,C;D,E,F;X,Y,Z';

Ожидаемые результаты (в трех отдельных столбцах):

+---+---+---+
| A | B | C |
+---+---+---+
| D | E | F |
+---+---+---+
| X | Y | Z |
+---+---+---+

Я ищу общее решение, которое не определило количество столбцов и строк. Итак, строка:

declare @str varchar(max)='A,B;D,E';

будет разбит на таблицы с двумя столбцами:

+---+---+
| A | B |
+---+---+
| D | E |
+---+---+

Мои усилия Моей первой идеей было использование динамического SQL, который превращает строку в:insert into dbo.temp values (...) Этот подход, хотя и очень быстрый, имеет незначительный недостаток, поскольку требует сначала создания таблицы с нужным количеством столбцов. Я представил этот метод вответ на мой вопрос ниже просто чтобы вопрос был коротким.

Другая идея - записать строку в файл CSV на сервере, а затемbulk insert от него. Хотя я не знаю, как это сделать и каково будет выполнение первой и второй идеи.

Причина, по которой я задал вопрос, заключается в том, что я хочу импортировать данные из Excel в SQL Server. Поскольку я экспериментировал с различными подходами ADO, этот метод отправки строки матрицы является убедительной победой, особенно когда длина строки увеличивается. Я задал вопрос младшему брату-близнецу:Превратить диапазон Excel в строку VBA где вы найдете предложения, как подготовить такую ​​строку из диапазона Excel.

премия Я решил наградитьMatt, Я весил высокоШон Ланге ответ. Спасибо, Шон. Мне понравился ответ Мэтта за его простоту и краткость. Различные подходы, кроме Мэтта и Шона, могут использоваться параллельно, поэтому в настоящее время я не принимаю никакого ответа (обновленная информация: наконец, через несколько месяцев я принял ответ Мэтта). Я хочу поблагодаритьАхмед Саид за его идею с VALUES, потому что это хорошая эволюция ответа, с которого я начал. Конечно, это не соответствует ни Мэтту, ни Шону. Я проголосовал за каждый ответ. Я буду признателен за любые отзывы от вас об использовании этих методов. Спасибо за квест.

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

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