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