Descomponer un string

23/05/2007 - 00:51 por Carlos | Informe spam
SQL2005

En una sp tengo la variable

@parametro varchar(30)

que contiene lo siguiente

@parametro = "3,12,5,24"

Alguien conoce algun procedimiento para descomponer cada valor de la string?

Necesito me devuelva en cada loop los valores
3
12
5
24


Gracias

Preguntas similare

Leer las respuestas

#1 Oswaldo
23/05/2007 - 02:02 | Informe spam
Es estrictamente necesario que hagas esto dentro de un sp de SQL Server?
Se podría hacer con un ciclo y la utilización de las funciones de cadena
como Substring. Pero sería ineficiente.

En la mayoría de los lenguajes de programación existe un Split ( o su
equivalente) el cual regresa en un arreglo, ese tipo de cadenas separadas,
enviandole como parámetro la cadena y el separador (en tú caso una ",").

Si lo que deseas es descomponerlo para realizar una insersión o
actualización existen opciones muy optimas como el uso de openXml, que
permite inserciones masivas de información en un solo paso. Puedes leer sobre
ello en la ayuda de SQL.

Saludos!

"Carlos" wrote:

SQL2005

En una sp tengo la variable

@parametro varchar(30)

que contiene lo siguiente

@parametro = "3,12,5,24"

Alguien conoce algun procedimiento para descomponer cada valor de la string?

Necesito me devuelva en cada loop los valores
3
12
5
24


Gracias



Respuesta Responder a este mensaje
#2 Alejandro Mesa
23/05/2007 - 02:59 | Informe spam
Carlos,

Aca te paso un link que apunta a un articulo dedicado completamente a este
tema.

Arrays and Lists in SQL Server 2005
http://www.sommarskog.se/arrays-in-sql-2005.html


AMB

"Carlos" wrote:

SQL2005

En una sp tengo la variable

@parametro varchar(30)

que contiene lo siguiente

@parametro = "3,12,5,24"

Alguien conoce algun procedimiento para descomponer cada valor de la string?

Necesito me devuelva en cada loop los valores
3
12
5
24


Gracias



Respuesta Responder a este mensaje
#3 Jesús López
23/05/2007 - 15:44 | Informe spam
Yo utilizaría XML en lugar de números separados por comas:

Algo como

DECLARE @numeros xml
SET @numeros '<n>3</n>
<n>1</n>
<n>2</n>
<n>5</n>
<n>24</n>'

SELECT n.value('.', 'int') AS n
FROM @numeros.nodes('/n') Nums(n)

Esta select devuelve un conjunto de registros:

n
3
1
2
5
24

(5 row(s) affected)

Así lo puedes incluir en otras sentencias SQL de manejo de conjunto de
registros

Si es SQL Server 2000 usaría OPENXML:

DECLARE @numeros varchar(8000)
SET @numeros '<ns>
<n>3</n>
<n>1</n>
<n>2</n>
<n>5</n>
<n>24</n>
</ns>'

DECLARE @xmlDoc int
EXEC sp_xml_preparedocument @xmlDoc OUT, @numeros

SELECT n
FROM OPENXML (@xmlDoc, '/ns/n') WITH (n int '.')

EXEC sp_xml_removedocument @xmlDoc

Esta otra select devuelve el mismo conjunto de registros.


Otra posibilidad con SQL Server 2005 es unar una función tabular CLR como
esta:

public partial class UserDefinedFunctions
{
[SqlFunction(FillRowMethodName = "FillRow",TableDefinition="StringField
nvarchar(4000)")]
public static IEnumerable fnSplitString(string str1, string separator)
{
return str1.Split(separator[0]);
}

public static void FillRow(Object obj, out SqlString StringField)
{
StringField = new SqlString((string)obj);
}

}

Al invocarla así:

SELECT CONVERT(int, StringField) AS n FROM dbo.fnSplitString('3,12,5,24',
',')

Devuelve el siguiente conjunto de registros:

n
3
12
5
24

(4 row(s) affected)


Saludos:

Jesús López
www.solidq.com





"Carlos" escribió en el mensaje
news:%
SQL2005

En una sp tengo la variable

@parametro varchar(30)

que contiene lo siguiente

@parametro = "3,12,5,24"

Alguien conoce algun procedimiento para descomponer cada valor de la
string?

Necesito me devuelva en cada loop los valores
3
12
5
24


Gracias


Respuesta Responder a este mensaje
#4 Jesús López
23/05/2007 - 15:56 | Informe spam
Otra posibilidad es manipular la cadena de números separados por comas para
convertirla en un documento xml y usar OPENXML:


DECLARE @numeros varchar(8000)
SET @numeros = '3,1,2,5,24'

DECLARE @xml varchar(8000)
SET @xml = '<ns><n>' + REPLACE(@numeros, ',', '</n><n>') + '</n></ns>'

DECLARE @xmlDoc int
EXEC sp_xml_preparedocument @xmlDoc OUT, @xml

SELECT n
FROM OPENXML (@xmlDoc, '/ns/n') WITH (n int '.')

EXEC sp_xml_removedocument @xmlDoc

Saludos:


Jesús López
www.solidq.com




"Jesús López" escribió en el mensaje
news:
Yo utilizaría XML en lugar de números separados por comas:

Algo como

DECLARE @numeros xml
SET @numeros > '<n>3</n>
<n>1</n>
<n>2</n>
<n>5</n>
<n>24</n>'

SELECT n.value('.', 'int') AS n
FROM @numeros.nodes('/n') Nums(n)

Esta select devuelve un conjunto de registros:

n
3
1
2
5
24

(5 row(s) affected)

Así lo puedes incluir en otras sentencias SQL de manejo de conjunto de
registros

Si es SQL Server 2000 usaría OPENXML:

DECLARE @numeros varchar(8000)
SET @numeros > '<ns>
<n>3</n>
<n>1</n>
<n>2</n>
<n>5</n>
<n>24</n>
</ns>'

DECLARE @xmlDoc int
EXEC sp_xml_preparedocument @xmlDoc OUT, @numeros

SELECT n
FROM OPENXML (@xmlDoc, '/ns/n') WITH (n int '.')

EXEC sp_xml_removedocument @xmlDoc

Esta otra select devuelve el mismo conjunto de registros.


Otra posibilidad con SQL Server 2005 es unar una función tabular CLR como
esta:

public partial class UserDefinedFunctions
{
[SqlFunction(FillRowMethodName = "FillRow",TableDefinition="StringField
nvarchar(4000)")]
public static IEnumerable fnSplitString(string str1, string separator)
{
return str1.Split(separator[0]);
}

public static void FillRow(Object obj, out SqlString StringField)
{
StringField = new SqlString((string)obj);
}

}

Al invocarla así:

SELECT CONVERT(int, StringField) AS n FROM dbo.fnSplitString('3,12,5,24',
',')

Devuelve el siguiente conjunto de registros:

n
3
12
5
24

(4 row(s) affected)


Saludos:

Jesús López
www.solidq.com





"Carlos" escribió en el mensaje
news:%
SQL2005

En una sp tengo la variable

@parametro varchar(30)

que contiene lo siguiente

@parametro = "3,12,5,24"

Alguien conoce algun procedimiento para descomponer cada valor de la
string?

Necesito me devuelva en cada loop los valores
3
12
5
24


Gracias






Respuesta Responder a este mensaje
#5 Carlos
23/05/2007 - 18:22 | Informe spam
Gracias a todos, me sirvio lo referente a usar XML

Gracias

"Jesús López" escribió en el mensaje
news:
Yo utilizaría XML en lugar de números separados por comas:

Algo como

DECLARE @numeros xml
SET @numeros > '<n>3</n>
<n>1</n>
<n>2</n>
<n>5</n>
<n>24</n>'

SELECT n.value('.', 'int') AS n
FROM @numeros.nodes('/n') Nums(n)

Esta select devuelve un conjunto de registros:

n
3
1
2
5
24

(5 row(s) affected)

Así lo puedes incluir en otras sentencias SQL de manejo de conjunto de
registros

Si es SQL Server 2000 usaría OPENXML:

DECLARE @numeros varchar(8000)
SET @numeros > '<ns>
<n>3</n>
<n>1</n>
<n>2</n>
<n>5</n>
<n>24</n>
</ns>'

DECLARE @xmlDoc int
EXEC sp_xml_preparedocument @xmlDoc OUT, @numeros

SELECT n
FROM OPENXML (@xmlDoc, '/ns/n') WITH (n int '.')

EXEC sp_xml_removedocument @xmlDoc

Esta otra select devuelve el mismo conjunto de registros.


Otra posibilidad con SQL Server 2005 es unar una función tabular CLR como
esta:

public partial class UserDefinedFunctions
{
[SqlFunction(FillRowMethodName = "FillRow",TableDefinition="StringField
nvarchar(4000)")]
public static IEnumerable fnSplitString(string str1, string separator)
{
return str1.Split(separator[0]);
}

public static void FillRow(Object obj, out SqlString StringField)
{
StringField = new SqlString((string)obj);
}

}

Al invocarla así:

SELECT CONVERT(int, StringField) AS n FROM dbo.fnSplitString('3,12,5,24',
',')

Devuelve el siguiente conjunto de registros:

n
3
12
5
24

(4 row(s) affected)


Saludos:

Jesús López
www.solidq.com





"Carlos" escribió en el mensaje
news:%
SQL2005

En una sp tengo la variable

@parametro varchar(30)

que contiene lo siguiente

@parametro = "3,12,5,24"

Alguien conoce algun procedimiento para descomponer cada valor de la
string?

Necesito me devuelva en cada loop los valores
3
12
5
24


Gracias






email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida