Разделить строку на таблицу по заданному разделителю строки и столбцу в 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, потому что это хорошая эволюция ответа, с которого я начал. Конечно, это не соответствует ни Мэтту, ни Шону. Я проголосовал за каждый ответ. Я буду признателен за любые отзывы от вас об использовании этих методов. Спасибо за квест.