Estoy buscando dividir '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 ...' (delimitado por comas) en una tabla o variable de tabla .
¿Alguien tiene una función que devuelva cada una en una fila?
sql
sql-server
tsql
sql-server-2008
jinsungy
fuente
fuente
Respuestas:
Aquí hay una solución algo anticuada:
En SQL Server 2008 puede lograr lo mismo con el código .NET. Tal vez funcionaría más rápido, pero definitivamente este enfoque es más fácil de administrar.
fuente
Prueba esto
O
Aquí hay muchas más formas de hacer lo mismo. ¿Cómo dividir una cadena delimitada por comas?
fuente
<
,>
o&
(por ejemplo, la entrada es una secuencia de números enteros). Cualquiera de los tres caracteres anteriores provocará un error de análisis en lugar del resultado esperado.SELECT b, CHARINDEX(@delimiter, @str, b) + LEN(@delimiter)
debería ser realmenteSELECT b, CHARINDEX(@delimiter, @str, b+1) + LEN(@delimiter)
. El b + 1 hace una gran diferencia. Probado aquí con espacio como delimitador, no funcionó sin esta solución.MAXRECURSION
opción para dividir más de 100 partes, reemplazarLEN
con algo de stackoverflow.com/q/2025585 para manejar espacios y excluirNULL
filas para lasNULL
entradas.Ha etiquetado este SQL Server 2008, pero es probable que los futuros visitantes a esta pregunta (con SQL Server 2016+) quieran saber
STRING_SPLIT
.Con esta nueva función incorporada ahora puede usar
Algunas restricciones de esta función y algunos resultados prometedores de las pruebas de rendimiento se encuentran en esta publicación de blog de Aaron Bertrand .
fuente
Esto es muy parecido a .NET, para aquellos de ustedes que están familiarizados con esa función:
fuente
Aquí está la función de división que pediste
ejecuta la función así
fuente
Fuente de esta respuesta: http://sqlhint.com/sqlserver/how-to/best-split-function-tsql-delimited
fuente
Estoy tentado de exprimir mi solución favorita. La tabla resultante constará de 2 columnas: PosIdx para la posición del entero encontrado; y Valor en entero.
Funciona utilizando CTE recursivo como la lista de posiciones, de 1 a 100 por defecto. Si necesita trabajar con una cadena de más de 100, simplemente llame a esta función usando 'option (maxrecursion 4000)' como se muestra a continuación:
fuente
uso
fuente
Este simple CTE le dará lo que se necesita:
fuente
Esta es otra versión que realmente no tiene restricciones (por ejemplo: caracteres especiales cuando se usa el enfoque xml, número de registros en el enfoque CTE) y se ejecuta mucho más rápido en función de una prueba en registros 10M + con una longitud promedio de cadena de origen de 4000. Espero que esto podría ayudar.
fuente
El uso de la tabla de conteo aquí es una función de cadena dividida (el mejor enfoque posible) por Jeff Moden
Referido de Tally OH! Una función mejorada de SQL 8K "CSV Splitter"
fuente
Este blog vino con una solución bastante buena usando XML en T-SQL.
Esta es la función que se me ocurrió en función de ese blog (cambiar el nombre de la función y el tipo de resultado emitido por necesidad):
fuente
fuente
fuente
Escribe esta función en el servidor SQL después de que se resuelva ese problema.
http://csharpdotnetsol.blogspot.in/2013/12/csv-function-in-sql-server-for-divide.html
fuente