none
consulta no funciona bien RRS feed

  • 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
    domingo, 26 de mayo de 2013 16:10

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

    domingo, 26 de mayo de 2013 17:55
  • 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
    domingo, 26 de mayo de 2013 18:37
  • 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

    domingo, 26 de mayo de 2013 20:28
  • 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

    domingo, 26 de mayo de 2013 21:44