Trabajando con cadenas de texto

30/05/2007 - 12:51 por JuanMa | Informe spam
Hola,
mando a un store procedure un nvarchar que contiene números separados
por coma :'4,5,16,3,45' .
El problema viene cuando intento en la Select meterlo dentro de un
WHERE nombre columna IN () . Me dice que no puede convertir un
nvarchar en un INT.

El ejemplo de abajo me ha funcionado(os paso tb el que no funciona) ,
pero el nvarchar solamente trae dos numeros separados por comas, el
problema es que hay veces que necesitaré mandar hasta 25 valores.
¿Se os ocurre algo?

NO FUNCIONA
declare
@id_areas nvarchar(1000),

BEGIN

SELECT @id_areas='3,5'

SELECT T_Usuario.id_usuario, T_Usuario.usu_codigo,
T_Usuario.usu_nombre, T_Usuario.usu_apellidos,
T_Usuario.usu_descripcion,T_Usuario.usu_estado,T_Usuario.usu_email,
T_Usuario.usu_entidad
FROM T_Usuario INNER JOIN T_NMP_Usuario_Perfil_Entidad ON
T_Usuario.id_usuario = T_NMP_Usuario_Perfil_Entidad.id_usuario
WHERE T_NMP_Usuario_Perfil_Entidad.id_area_entidad IN (@id_areas)

end

FUNCIONA
declare
@id_areas nvarchar(1000),
@id1 int,
@id2 int

BEGIN

SELECT @id_areas='3,5'
Select @id1 = CAST(SUBSTRING(@id_areas, 1, 1)AS INT)
SELECT @id2 = CAST(SUBSTRING(@id_areas, 3, 1)AS INT)

SELECT T_Usuario.id_usuario, T_Usuario.usu_codigo,
T_Usuario.usu_nombre, T_Usuario.usu_apellidos,
T_Usuario.usu_descripcion,T_Usuario.usu_estado,T_Usuario.usu_email,
T_Usuario.usu_entidad
FROM T_Usuario INNER JOIN T_NMP_Usuario_Perfil_Entidad ON
T_Usuario.id_usuario = T_NMP_Usuario_Perfil_Entidad.id_usuario
WHERE T_NMP_Usuario_Perfil_Entidad.id_area_entidad IN (@id1,@id2)

end
 

Leer las respuestas

#1 JuanMa
30/05/2007 - 13:31 | Informe spam
On 30 mayo, 12:51, JuanMa wrote:
Hola,
mando a un store procedure un nvarchar que contiene números separados
por coma :'4,5,16,3,45' .
El problema viene cuando intento en la Select meterlo dentro de un
WHERE nombre columna IN () . Me dice que no puede convertir un
nvarchar en un INT.

El ejemplo de abajo me ha funcionado(os paso tb el que no funciona) ,
pero el nvarchar solamente trae dos numeros separados por comas, el
problema es que hay veces que necesitaré mandar hasta 25 valores.
¿Se os ocurre algo?

NO FUNCIONA
declare
@id_areas nvarchar(1000),

BEGIN

SELECT @id_areas='3,5'

SELECT T_Usuario.id_usuario, T_Usuario.usu_codigo,
T_Usuario.usu_nombre, T_Usuario.usu_apellidos,
T_Usuario.usu_descripcion,T_Usuario.usu_estado,T_Usuario.usu_email,
T_Usuario.usu_entidad
FROM T_Usuario INNER JOIN T_NMP_Usuario_Perfil_Entidad ON
T_Usuario.id_usuario = T_NMP_Usuario_Perfil_Entidad.id_usuario
WHERE T_NMP_Usuario_Perfil_Entidad.id_area_entidad IN (@id_areas)

end

FUNCIONA
declare
@id_areas nvarchar(1000),
@id1 int,
@id2 int

BEGIN

SELECT @id_areas='3,5'
Select @id1 = CAST(SUBSTRING(@id_areas, 1, 1)AS INT)
SELECT @id2 = CAST(SUBSTRING(@id_areas, 3, 1)AS INT)

SELECT T_Usuario.id_usuario, T_Usuario.usu_codigo,
T_Usuario.usu_nombre, T_Usuario.usu_apellidos,
T_Usuario.usu_descripcion,T_Usuario.usu_estado,T_Usuario.usu_email,
T_Usuario.usu_entidad
FROM T_Usuario INNER JOIN T_NMP_Usuario_Perfil_Entidad ON
T_Usuario.id_usuario = T_NMP_Usuario_Perfil_Entidad.id_usuario
WHERE T_NMP_Usuario_Perfil_Entidad.id_area_entidad IN (@id1,@id2)

end



AQUI HE DADO CON LA SOLUCIÓN



CREATE PROCEDURE dbo.pa_t_usuarios_leer
@usu_nombre nvarchar(100) = '',
@tipo_filtro int=0,
@id_areas nvarchar(1000)=NULL

AS

IF @tipo_filtro = 0
BEGIN
declare @consulta varchar(1000)

select @consulta = 'SELECT id_usuario, usu_codigo, usu_nombre,
usu_apellidos,
usu_descripcion, usu_estado,usu_email, usu_entidad
FROM T_Usuario
WHERE (usu_nombre like ''%' + @usu_nombre + '%'') or (usu_apellidos
like ''%' + @usu_nombre + '%'')'

END

else

if @tipo_filtro =1
BEGIN

select @consulta = 'SELECT T_Usuario.id_usuario,
T_Usuario.usu_codigo, T_Usuario.usu_nombre, T_Usuario.usu_apellidos,
T_Usuario.usu_descripcion, T_Usuario.usu_estado,
T_Usuario.usu_email, T_Usuario.usu_entidad
FROM T_Usuario INNER JOIN T_NMP_Usuario_Perfil_Entidad ON
T_Usuario.id_usuario = T_NMP_Usuario_Perfil_Entidad.id_usuario
WHERE (T_NMP_Usuario_Perfil_Entidad.id_area_entidad IN (' +
@id_areas + ')) AND
( (T_Usuario.usu_apellidos LIKE ''%' + @usu_nombre +
'%'') OR (T_Usuario.usu_nombre LIKE ''%' + @usu_nombre + '%''))'

END

exec (@consulta)
GO

Preguntas similares