SQL Server - segmentar valor parámetros

   
Vista:

segmentar valor parámetros

Publicado por Gatsu (7 intervenciones) el 14/01/2010 14:11:29
Hola muy buenas tardes a todos

Imagino que no se puede hacer, pero no pierdo la esperanza de que me equivoque, vereis, necesito hacer un procedimiento almacenado, el cual que recibe un parámetro, separarlo por los espacios que contiene y guardar en un array las palabras que devuelve, de ese array, recorrer un bucle y mientras que tenga palabras el array, añadir dichas palabras dentro del where de la consulta.

Gracias de antemano
Un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de roger

RE:segmentar valor parámetros

Publicado por roger (173 intervenciones) el 14/01/2010 14:26:58
No se si te refieres a algo como esto: Hace poco tuve que hacer un procedimiento que recibiera una cadena de valores separados por coma, y cada uno de esos valores iba a ir en la condicion where de la consulta, en un IN, algo asi
select * from tabla where parametro in (listaDeValores)

Obviamente si se manda toda la cadena no funcionará, asi que lo que hice fue convertir esa cadena de valores a XML y hacer la consulta.
Para lo que dices seria mas o menos asi:

Declare @listaValores varchar(1000)

set @listaValores ='1 25 45 85 96 88 77 56'

DECLARE @listaValoresXML XML

SET @listaValores = '<Valores><ID>' + replace(@listaValores,' ','</ID><ID>') + '</ID></Valores>'

SET @listaValoresXml = @listaValores

SELECT id
FROM tabla
WHERE id IN (SELECT ParamValues.ID.value('.','VARCHAR(50)')
FROM @listaValoresXml.nodes('/Categories/ID') as ParamValues(ID)
)

Mira que se construye un xml con la lista de valores que quede asi

<Valores>
<ID>
</ID>
<ID>
</ID>
</Valores>

Y la consulta :
SELECT ParamValues.ID.value('.','VARCHAR(50)') FROM @listaValoresXml.nodes('/Categories/ID') as ParamValues(ID)
trae cada uno de esos ID que hay en el xml

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:segmentar valor parámetros

Publicado por Gatsu (7 intervenciones) el 14/01/2010 16:15:34
Muchas gracias por tu rápida respuesta, me ha facilitado gran parte de la faena que veía imposible. Hasta la select del xml va bien, el problema es al meterlo en el where, mi parametro siempre recibira caracteres, que en el where necesitan el "like" y "COLLATE Traditional_Spanish_CI_AI", entonces es cuando da el error.
He probado a hacerlo mediante un cursor, pero tampoco me funciona
Te pongo el código de la declaracion del cursor y del where para que veas a lo que me refiero

Declare @listaValores varchar(1000)

set @listaValores = ''

declare array cursor for SELECT ParamValues.ID.value('.','VARCHAR(50)') FROM @listaValoresXml.nodes('/Valores/ID') as ParamValues(ID)

WHERE
(dbo.Picture.Master = 1)
open array
fetch array into @listaValores
while(@@fetch_status = 0)
begin
AND dbo.ProductCulture.ProductName LIKE @listaValores COLLATE Traditional_Spanish_CI_AI
fetch array into @listaValores
end
close array
deallocate array

AND (dbo.ProductDetails.Master = 1)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de ROGER

RE:segmentar valor parámetros

Publicado por ROGER (173 intervenciones) el 14/01/2010 16:34:57
prueba asi
SELECT ParamValues.ID.value('.','VARCHAR(50)') COLLATE Traditional_Spanish_CI_AI FROM @listaValoresXml.nodes('/Valores/ID') as ParamValues(ID)

Te recomiendo que evites al maximo el uso de cursores, pues sql server no esta diseñado para trabajar registro por registro, es mucho mas optimo al trabajar con conjuntos de datos.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:segmentar valor parámetros

Publicado por Gatsu (7 intervenciones) el 14/01/2010 16:59:25
Ahora mismo he llegado a conseguir que la select me devuelva cada palabra con % (no es muy dificil, solo es poner '%' antes y despues de ParamValues.ID.value('.','VARCHAR(50)')

El problema es que parece que "like" e "in" no se llevan bien, ¿hay alguna manera de que si que funcione?

Gracias por tu esfuerzo

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de roger

RE:segmentar valor parámetros

Publicado por roger (173 intervenciones) el 14/01/2010 17:13:10
no entiendo, como es la consulta que necesitas hacer????
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:segmentar valor parámetros

Publicado por Gatsu (7 intervenciones) el 14/01/2010 17:20:02
WHERE dbo.ProductCulture.ProductName in (SELECT '%' + ParamValues.ID.value('.','VARCHAR(50)') + '%' COLLATE Traditional_Spanish_CI_AI FROM @listaValoresXml.nodes('/Valores/ID') as ParamValues(ID))

asi tal cual no da error, y me devuelve los registros con '%' a la izquierda y a la derecha, entonces tengo que poner el "like", pero estando el "in" no puedo poner "like"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias

RE:segmentar valor parámetros

Publicado por Isaias (3180 intervenciones) el 14/01/2010 17:45:01
Con el permiso........

Pasa en tu variable, los valores separados por COMAS y haces un query dinamico con dicha variable, utilizando IN
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:segmentar valor parámetros

Publicado por Gatsu (7 intervenciones) el 14/01/2010 17:59:13
Toda colaboración es bien recibida
Tu solución también es buena, pero ocurre lo mismo, el valor que yo paso por parámetros tengo que buscarlo con un "like" para que el uso de porcentajes funcione.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de roger

RE:segmentar valor parámetros

Publicado por roger (173 intervenciones) el 14/01/2010 19:01:57
WHERE EXISTS (SELECT '%' + ParamValues.ID.value('.','VARCHAR(50)') + '%' COLLATE Traditional_Spanish_CI_AI FROM @listaValoresXml.nodes('/Valores/ID') as ParamValues(ID)
WHERE dbo.ProductCulture.ProductName like '%' + ParamValues.ID.value('.','VARCHAR(50)') + '%' COLLATE Traditional_Spanish_CI_AI)

Y pues la idea es no tener que hacer querys dinamicos. Siempre que se pueda hacer la consulta, es mejor evitar tener que armar un query dinamico para ejecutarlo con EXEC o sp_executeSQL
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:segmentar valor parámetros

Publicado por Gatsu (7 intervenciones) el 14/01/2010 21:10:17
Perdón por la tardanza.
Hasta el lunes no podré probarlo, no dispongo del equipo necesario.
Muchas gracias a todos por vuestro tiempo, en cuanto lo pruebe os lo haré saber con su resultado correspondiente.

Un saludo

Fran
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:segmentar valor parámetros

Publicado por Gatsu (7 intervenciones) el 18/01/2010 09:57:53
Buenos días a todos

Como prometí, postearía con las novedades. El procedimiento ya no da error, pero el problema es que devuelve todos los registros que contienen cualquiera de las palabras guardadas en el xml, entonces me devuelve cientos de resultados.
Lo malo es que exists funciona así y no se puede cambiar, ¿creeis que se puede hacer algo para que devuelva los resultados que contengan todas las palabras almacenadas en el xml?

Muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar