Dividir la cadena en el delimitador de fila y de columna de la tabla dada en el servidor SQL
¿Cómo dividir la cadena que contiene la matriz en la tabla en SQL Server? La cadena tiene columnas y delimitadores de fila.
Supongamos que tengo una cadena:
declare @str varchar(max)='A,B,C;D,E,F;X,Y,Z';
Resultados esperados (en tres columnas separadas):
+---+---+---+
| A | B | C |
+---+---+---+
| D | E | F |
+---+---+---+
| X | Y | Z |
+---+---+---+
Estoy buscando una solución general que no haya definido el número de columnas y filas. Entonces la cadena:
declare @str varchar(max)='A,B;D,E';
se dividirá en una tabla con dos columnas:
+---+---+
| A | B |
+---+---+
| D | E |
+---+---+
Mis esfuerzos. Mi primera idea fue usar SQL dinámico que convierte la cadena en:insert into dbo.temp values (...)
Este enfoque, aunque muy rápido, tiene un inconveniente menor porque requiere crear primero una tabla con el número correcto de columnas. He presentado este método enla respuesta a mi propia pregunta a continuación solo para mantener la pregunta corta.
Otra idea sería escribir la cadena en un archivo CSV en el servidor y luegobulk insert
de eso. Aunque no sé cómo hacerlo y cuál sería el rendimiento de la primera y segunda idea.
La razón por la que hice la pregunta es porque quiero importar datos de Excel a SQL Server. Como he experimentado con diferentes enfoques ADO, este método de envío de cadenas de matriz es una victoria aplastante, especialmente cuando aumenta la longitud de la cadena. Le pregunté a un hermano gemelo más joven de la pregunta aquí:Convierta el rango de Excel en una cadena VBA donde encontrará sugerencias sobre cómo preparar una cadena de este tipo desde el rango de Excel.
Generosidad Decidí premiarMate. Pesaba muchoSean Lange's responder. Gracias Sean Me gustó la respuesta de Matt por su simplicidad y brevedad. Diferentes enfoques, aparte de los de Matt y Sean, podrían ser de uso paralelo, por lo que por el momento no estoy aceptando ninguna respuesta (actualización: finalmente, después de unos meses, he aceptado la respuesta de Matt). Deseo agradecerAhmed Saeed por su idea con VALUES, porque es una buena evolución de la respuesta con la que comencé. Por supuesto, no es rival para Matt o Sean's. Voté cada respuesta. Apreciaré cualquier comentario de usted sobre el uso de estos métodos. Gracias por la búsqueda