Dividir a seqüência de caracteres na tabela com o delimitador de linha e o delimitador de coluna no SQL Server

Como dividir seqüência de caracteres contendo matriz em tabela no SQL Server? String possui colunas e delimitadores de linha.

Suponha que eu tenha uma string:

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

Resultados esperados (em três colunas separadas):

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

Estou procurando uma solução geral que não tenha definido o número de colunas e linhas. Então a string:

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

será dividido em tabela com duas colunas:

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

Meus esforços. Minha primeira idéia foi usar SQL dinâmico que transforma a string em:insert into dbo.temp values (...) Essa abordagem, embora muito rápida, tem uma pequena desvantagem, pois exige a criação de uma tabela com o número certo de colunas primeiro. Eu apresentei esse método ema resposta para minha própria pergunta abaixo apenas para manter a pergunta curta.

Outra idéia seria anotar a string em um arquivo CSV no servidor e depoisbulk insert a partir dele. Embora eu não saiba como fazê-lo e qual seria o desempenho da primeira e da segunda ideia.

O motivo pelo qual fiz a pergunta é porque quero importar dados do Excel para o SQL Server. Como experimentei diferentes abordagens da ADO, esse método de enviar string de matriz é uma vitória esmagadora, especialmente quando o comprimento da string aumenta. Eu fiz a um irmão gêmeo mais novo da pergunta aqui:Transforme o intervalo do Excel em string VBA onde você encontrará sugestões de como preparar essa sequência do intervalo do Excel.

Recompensa Eu decidi premiarMatt. Eu pesava muitoSean Lange's responda. Obrigado Sean. Gostei da resposta de Matt por sua simplicidade e brevidade. Diferentes abordagens, além das de Matt e Sean, podem estar em uso paralelo; portanto, por enquanto não aceito nenhuma resposta (atualização: finalmente, depois de alguns meses, aceitei a resposta de Matt). Eu gostaria de agradecerAhmed Saeed por sua ideia com VALUES, pois é uma boa evolução da resposta com a qual comecei. Claro, não é páreo para o Matt ou o Sean. Votei cada resposta. Agradecemos qualquer comentário seu sobre o uso desses métodos. Obrigado pela missão.

questionAnswers(12)

yourAnswerToTheQuestion