Usuario
consulta no funciona bien

Pregunta
-
Hola:
Tengo
Dim sqlr As SqlDataReader sqlc.CommandType = CommandType.StoredProcedure sqlc.Parameters.AddWithValue("@condicion", strcondicion) sqlc.Parameters.AddWithValue("@idioma", 1) sqlc.Parameters.AddWithValue("@orden", "nombre") sqlc.Parameters.AddWithValue("@comienzo", 10) sqlc.Parameters.AddWithValue("@maximonumeroregistros", 10) cnconexion.Open() sqlr = sqlc.ExecuteReader Response.Write(sqlr.HasRows) sqlr.Close()
El procedimiento almacenado es
USE [Cresolia] GO /****** Object: StoredProcedure [dbo].[seleccionar_personal] Script Date: 26/05/2013 10:15:40 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[seleccionar_personal] ( @orden nvarchar(50), @idioma tinyint, @comienzo int, @maximonumeroregistros int, @condicion nvarchar(max)='' ) AS set nocount on declare @sql nvarchar(max), @fin int set @comienzo+=1 set @fin=@comienzo+@maximonumeroregistros-1 if @condicion<>'' set @condicion=' where '+ @condicion set @sql=N'select id0,nombre,tregion,falta,paginapersonal,npuntos,nobras,npublicaciones,valoracionmedia from (select row_number() over(order by case @orden when ''nombre'' then nombre end,case @orden when ''nombre DESC'' then nombre end desc,case @orden when ''tregion'' then pais end,region,case @orden when ''tregion DESC'' then pais end desc,region desc,case @orden when ''falta'' then falta end,case @orden when ''falta DESC'' then falta end desc,case @orden when ''paginapersonal'' then paginapersonal end,case @orden when ''paginapersonal DESC'' then paginapersonal end desc,case @orden when ''npuntos'' then npuntos end,case @orden when ''npuntos DESC'' then npuntos end desc,case @orden when ''nobras'' then nobras end,case @orden when ''nobras DESC'' then nobras end desc,case @orden when ''npublicaciones'' then npublicaciones end,case @orden when ''npublicaciones DESC'' then npublicaciones end desc,case @orden when ''valoracionmedia'' then valoracionmedia end,case @orden when ''valoracionmedia DESC'' then valoracionmedia end desc) as numero,id0,nombre,tregion,falta,paginapersonal,npuntos,nobras,npublicaciones,valoracionmedia from (select c10 as id0,nombre+'' ''+apellidos as nombre,case @idioma when 1 then pais_espanol when 2 then +pais_ingles when 3 then +pais_frances else pais_portugues end as pais,case @idioma when 1 then region_espanol when 2 then +region_ingles when 3 then +region_frances else region_portugues end as region,case @idioma when 1 then r.region_espanol+'' - ''+pais_espanol when 2 then r.region_ingles+'' - ''+pais_ingles when 3 then r.region_frances+'' - ''+pais_frances else r.region_portugues+'' - ''+pais_portugues end as tregion,falta,(select count(c20) from cuentas.dbo.cuentas2 where c21=c1.c10) as paginapersonal,puntos as npuntos,dbo.nobras_personal(c10) as nobras,dbo.npublicaciones_personal(c10) as npublicaciones,case dbo.valoracion_media_personal(c10) when 1 then case @idioma when 1 then ''excelente'' when 2 then ''excellent'' when 3 then ''excellente'' else ''excelente'' end when 2 then case @idioma when 1 then ''bueno'' when 2 then ''good'' when 3 then ''bon'' else ''bom'' end when 3 then case @idioma when 1 then ''regular'' when 2 then ''regular'' when 3 then ''régulière'' else ''regular'' end when 4 then case @idioma when 1 then ''malo'' when 2 then ''bad'' when 3 then ''mauvais'' else ''ruim'' end when 5 then case @idioma when 1 then ''pésimo'' when 2 then ''very bad'' when 3 then ''trés mauvais'' else ''muito ruim'' end else case @idioma when 1 then ''sin valorar'' when 2 then ''without valuation'' when 3 then ''sans classer'' else ''sem classificar'' end end as valoracionmedia from cuentas.dbo.cuentas1 c1 inner join dbo.regiones r on r0=c1.region inner join dbo.paises on p0=r.r1 where activo=1 and cresolia=1) tabla0'+ @condicion+') tabla1 where numero between @comienzo and @fin' EXEC sp_executesql @sql, N'@idioma tinyint,@orden nvarchar(50),@comienzo int,@fin int',@idioma,@orden,@comienzo,@fin
Si pongo 1 en el parámetro @comienzo, la consulta funciona bien, me dice que hay registros. Si pongo mayor que 1 me dice que no tiene registros (hasrows) ¿veis el por qué? En la tabla tengo 15 registros. La condición -strcondicion- es "nombre='r r'", que existe
Me doy cuenta de que ocupa mucho tiempo el ayudarme, por eso os estaría muy agradecido
- Editado volar domingo, 26 de mayo de 2013 16:14
Todas las respuestas
-
hola
si tomas el SELECT que armas en el @sql le pones valores fijos que representen ese parametro que asignas desde codigo y lo ejecutas directo en el sql server management studio, este devuelve algun valor ?
solo para descartar que el query este correcto
Leandro Tuttini
Blog
Buenos Aires
Argentina -
Hola:
Gracias Leandro. El fallo que veo es que el select row_number me da números consecutivos partiendo de 1. Si yo al select le doy una condición where, los números @comienzo y @fin ya no parten del 1. Entonces no se me ocurre nada que hacer.
Lo que quiero es que me saque n registros. El row_number lo uso solamente para que me saque los registros entre comienzo y fin, al efecto de hacer uso el enablepaging=true del objectdatasource
Estoy investigando para saber qué hacer. Si podeis ayudarme os lo agradecería
- Editado volar domingo, 26 de mayo de 2013 18:38
-
en esta linea
EXEC sp_executesql @sql, N'@idioma tinyint,@orden nvarchar(50),@comienzo int,@fin int',@idioma,@orden,@comienzo,@fin
porque la parte
'@idioma tinyint,@orden nvarchar(50),@comienzo int,@fin int'
esta entre comillas simples y el resto no ?
es mas que significa esto
tabla0'+ @condicion+'
no veo que dejes espacio entre el table0 y el valor que unes
ademas si son parametros porque no pones en una unica cadena
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina -
Porque no armas la consulta
set @sql=N'select id0,nombre,tregion,falta,paginapersonal,npuntos,nobras,npublicaciones,valoracionmedia from (select row_number() over(order by case @orden when ''nombre'' then nombre end,case @orden when ''nombre DESC'' then nombre end desc,case @orden when ''tregion'' then pais end,region,case @orden when ''tregion DESC'' then pais end desc,region desc,case @orden when ''falta'' then falta end,case @orden when ''falta DESC'' then falta end desc,case @orden when ''paginapersonal'' then paginapersonal end,case @orden when ''paginapersonal DESC'' then paginapersonal end desc,case @orden when ''npuntos'' then npuntos end,case @orden when ''npuntos DESC'' then npuntos end desc,case @orden when ''nobras'' then nobras end,case @orden when ''nobras DESC'' then nobras end desc,case @orden when ''npublicaciones'' then npublicaciones end,case @orden when ''npublicaciones DESC'' then npublicaciones end desc,case @orden when ''valoracionmedia'' then valoracionmedia end,case @orden when ''valoracionmedia DESC'' then valoracionmedia end desc) as numero,id0,nombre,tregion,falta,paginapersonal,npuntos,nobras,npublicaciones,valoracionmedia from
(select c10 as id0,nombre+'' ''+apellidos as nombre,case @idioma when 1 then pais_espanol when 2 then +pais_ingles when 3 then +pais_frances else pais_portugues end as pais,case @idioma when 1 then region_espanol when 2 then +region_ingles when 3 then +region_frances else region_portugues end as region,case @idioma when 1 then r.region_espanol+'' - ''+pais_espanol when 2 then r.region_ingles+'' - ''+pais_ingles when 3 then r.region_frances+'' - ''+pais_frances else r.region_portugues+'' - ''+pais_portugues end as tregion,falta,(select count(c20) from cuentas.dbo.cuentas2 where c21=c1.c10) as paginapersonal,puntos as npuntos,dbo.nobras_personal(c10) as nobras,dbo.npublicaciones_personal(c10) as npublicaciones,case dbo.valoracion_media_personal(c10) when 1 then case @idioma when 1 then ''excelente'' when 2 then ''excellent'' when 3 then ''excellente'' else ''excelente'' end when 2 then case @idioma when 1 then ''bueno'' when 2 then ''good'' when 3 then ''bon'' else ''bom'' end when 3 then case @idioma when 1 then ''regular'' when 2 then ''regular'' when 3 then ''régulière'' else ''regular'' end when 4 then case @idioma when 1 then ''malo'' when 2 then ''bad'' when 3 then ''mauvais'' else ''ruim'' end when 5 then case @idioma when 1 then ''pésimo'' when 2 then ''very bad'' when 3 then ''trés mauvais'' else ''muito ruim'' end else case @idioma when 1 then ''sin valorar'' when 2 then ''without valuation'' when 3 then ''sans classer'' else ''sem classificar'' end end as valoracionmedia
from cuentas.dbo.cuentas1 c1 inner join dbo.regiones r on r0=c1.region inner join dbo.paises on p0=r.r1 where activo=1 and cresolia=1) tabla0'+ @condicion+') tabla1 where numero between @comienzo and @fin'
quitando los parámetros y estableciendols como haces con @condicion? .Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos