SQL - Variables en select SQL

 
Vista:

Variables en select SQL

Publicado por Joss M (1 intervención) el 23/09/2011 01:13:43
Hola buenas tengo una duda aver si pueden resolver en un prosedure que creeo

ALTER PROCEDURE [dbo].[buslirbo]
@tipo nvarchar(50),
@dato nvarchar(50)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

declare @sql varchar(4000)
select @sql = 'select * from Libro Where ' + @tipo + ' = ' + @dato + ''
exec (@sql)
END

tengo duda por que con unos tipos de datos si me da la consulta, y con los enteros no donde tengo lleno todos los campos con numero si me da el resultado pero donde tengo cadena no
me da un erro asi
Conversion failed when converting the nvarchar value 'FRANCISCO ORTIZ JUAN' to data type int.

igual si quiero buscar me da error si no meto un numero pero si las variables las tengo en nvarchar los campos estan en nvarchar tambien

GRacias
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
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Variables en select SQL

Publicado por leonardo_josue (1173 intervenciones) el 23/09/2011 16:28:22
Hola Joss M:

No mencionas en tu correo qué DBMS estás utilizando, pero por la sintaxis y el error puedo suponer que se trata de SQL Server.... es importante que siempre especifiques este dato cuando publiques alguna pregunta, pues la sintaxis entre los distintos motores en ocasiones es bastante diferente. En cuanto a tu problema, SQL Server realiza algunas conversiones de datos implícitas en las consultas, es decir que no se declaran, pero que al momento de ejecutar la consulta se realizan. esto en ocasiones resulta benéfico, pues te evita tener que hacer las conversiones, pero en otras como es tu caso, puede traer problemas. Veamos algunos ejemplos para ver si se entiende el concepto.

Supongamos que tenemos una tabla con un campo tipo entero, podríamos entonces hacer las comparaciones así:

1
2
3
4
5
declare @table table (campo int)
insert into @table values (1)
insert into @table values (2)
select * from @table where campo = 1
select * from @table where campo = '1'


Si observas en la segunda consulta estoy comparando como cadena (campo = '1'), sin embargo la consulta funciona, pues internamente se hace una conversión de tipos.

Veamos ahora este caso, supongamos que tenemos la misma tabla, pero ahora con el tipo varchar(10)

1
2
3
4
5
declare @table table (campo varchar(10))
insert into @table values ('1')
insert into @table values ('2')
select * from @table where campo = 1
select * from @table where campo = '1'


Las dos consultas funcionan verdad??? entonces donde diablos está el problema. Observa que los registros en la tabla SON NUMEROS, aunque están representados como cadena ('1', '2')

Supongamos que tenemos la misma tabla que en el ejemplo anterior, PERO AGREGAMOS UN REGISTRO QUE NO SEA NÚMERO:

1
2
3
4
5
declare @table table (campo varchar(10))
insert into @table values ('1')
insert into @table values ('2')
insert into @table values ('OTRO')
select * from @table where campo = 1


La consulta te regresará el error que comentas:

1
2
Mens. 245, Nivel 16, Estado 1, Línea 6
Conversion failed when converting the varchar value 'OTRO' to data type int.


¿Qué es lo que pasó, si en la consulta anterior funcionó perfectamente?, bueno, lo que pasa es que al querer comparar contra un número SQL Server intenta convertir TODOS LOS VALORES DE LA COLUMNA A ENTERO, en el ejemplo anterior no hubo problema pues ('1' y '2') SI PUEDEN CONVERTIRSE A ENTERO, pero la palabra 'OTRO' NO PUEDE CONVERTIRSE.

¿Qué tienes que hacer? bueno, SIEMPRE QUE TUS CAMPOS SEAN TIPO CADENA UTILIZA LA COMPARACIÓN CON COMILLAS

1
2
3
4
5
declare @table table (campo varchar(10))
insert into @table values ('1')
insert into @table values ('2')
insert into @table values ('OTRO')
select * from @table where campo = '1'


En tu caso, como estás armando una consulta al vuelo para incluir las comillas en la consulta seria más o menos así:

1
' = ''' + @dato + ''''


Dale un vistazo a los scripts y si queda alguna duda lo comentas en el foro.

Saludos
Leo.
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

Variables en select SQL

Publicado por Isaias (1 intervención) el 19/10/2012 13:18:14
tengo un problema .como restringo al total de string cuando tenga que ingresar en un dni numeros y caracteres que solo lo lea o ingrese el numero pero no el texto como lo hago por favor.

declare @dn char(8), @dc int,@x char(1),@c int
set @dn='1234a67p'
set @dc=(select LEN(@dn))
set @c=1
while(@c<=8)
begin
set @x=(select SUBSTRING(@dn,@c,1))
if(@x>=0 and @x<10 and @x!=''and @x!='')
begin
select @x
end
set @c=@c+1
end



select *from TAlumno
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