none
Ayuda con Sql Dinamico por favor... RRS feed

  • Pregunta

  •  

    Hola...

    Estoy por primera vez trabajando con Sql Dinamico gracias a un link muy bueno que me facilitaron por aca... http://www.sommarskog.se/dyn-search-2005.html

    Bueno ya realice mi store procedure y quedo asi...

    Primero explico tengo una tabla de autos, esta tiene un foreign key a un tabla modelos, a su vez modelo tiene un foreign key a una tabla marcas y esta a una tabla Tipos... Tambien hay otros para una tabla usuario y y estados...

     

    ALTER PROCEDURE [veh].[Obtener_Automoviles]

    @TipoId INT,

    @MarcaId INT = NULL,

    @ModeloId INT = NULL,

    @EstadoId INT = NULL,

    @Precio MONEY = NULL,

    @debug BIT = 0

    WITH EXECUTE AS OWNER

    AS

    BEGIN

    DECLARE @sql NVARCHAR(4000)

    DECLARE @paramlist NVARCHAR(4000)

    BEGIN

    SELECT @sql = 'SELECT usua.Login,   pub.PublicacionesVehiculoId, pub.Titulo, pub.Precio, pub.Ano, pub.Kilometraje, pub.TraccionIndependiente, pub.Transmision, est.Estado, mon.Simbolo

    FROM veh.PublicacionesVehiculos pub 

    INNER JOIN usr.Usuarios usua ON pub.UsuarioId = usua.UsuarioId

    INNER JOIN veh.PublicacionesAutomoviles aut ON pub.PublicacionesVehiculoId = aut.PublicacionVehiculoId

    INNER JOIN dbo.Regiones reg ON pub.RegionId = reg.RegionId

    INNER JOIN dbo.Estados est ON reg.EstadoId = est.EstadoId

    INNER JOIN veh.ModelosVehiculos mod ON aut.ModeloId = mod.ModeloId

    INNER JOIN veh.MarcasVehiculos mar ON mod.MarcaId = mar.MarcaId

    INNER JOIN veh.TiposVehiculos tip ON mar.TipoId = tip.TipoId

    INNER JOIN dbo.Monedas mon ON pub.MonedaId = mon.MonedaId

    WHERE tip.TipoId = @TipoId'

     

     

     

    IF @MarcaId IS NOT NULL

    SELECT @sql = @sql + ' AND mar.MarcaId = @xMarcaId' +

       ' AND mod.MarcaId = @xMarcaId'

    IF @ModeloId IS NOT NULL

    SELECT @sql = @sql + ' AND mod.ModeloId = @xModeloId' +

       ' AND aut.ModeloId = @xModeloId'

      IF @EstadoId IS NOT NULL 

    SELECT @sql = @sql + ' AND reg.EstadoId = @xEstadoId' +

       ' AND est.EstadoId = @xEstadoId'

    IF @Precio IS NOT NULL

    SELECT @sql = @sql + ' AND pub.Precio <= @xPrecio'

    SELECT @sql = @sql + ' ORDER BY usua.EstrellasUsuario'

     

    IF @debug = 1                                              

    PRINT @sql

     

    SELECT @paramlist = '@xMarcaId INT,

        @xModeloId INT,

        @xEstadoId INT,

        @xPrecio MONEY'  

    EXEC sp_executesql @sql, @paramlist, @MarcaId, @ModeloId, @EstadoId, @Precio

    END

     

    No da error pero cuando trato de ejecutarlo, EXECUTE [veh].[Obtener_Automoviles] 1, NULL, NULL, NULL, NULL, no me trae ningun registro ni tabla, solo dice que ese ejecuto bien y ya...

    Por que sera esto... Osea para mas como si halla ejecutado una inserccion o algo asi ya que no devuelve nada...

    Mil gracias...

    jueves, 10 de febrero de 2011 15:54

Respuestas

  • Para eso esta el parametro @debug, para que le pases valor 1 y puedas ver la sentencia creada. Luego copias esa sentencia y tratas de ejecutarla para ver que pasa.

    Que pasa si ejecutas esta sentencia:

    SELECT
        usua.Login,   pub.PublicacionesVehiculoId, pub.Titulo, pub.Precio, pub.Ano, pub.Kilometraje,
        pub.TraccionIndependiente, pub.Transmision, est.Estado, mon.Simbolo
    FROM
        veh.PublicacionesVehiculos pub 
        INNER JOIN usr.Usuarios usua ON pub.UsuarioId = usua.UsuarioId
        INNER JOIN veh.PublicacionesAutomoviles aut ON pub.PublicacionesVehiculoId = aut.PublicacionVehiculoId
        INNER JOIN dbo.Regiones reg ON pub.RegionId = reg.RegionId
        INNER JOIN dbo.Estados est ON reg.EstadoId = est.EstadoId
        INNER JOIN veh.ModelosVehiculos mod ON aut.ModeloId = mod.ModeloId
        INNER JOIN veh.MarcasVehiculos mar ON mod.MarcaId = mar.MarcaId
        INNER JOIN veh.TiposVehiculos tip ON mar.TipoId = tip.TipoId
        INNER JOIN dbo.Monedas mon ON pub.MonedaId = mon.MonedaId
    WHERE
        tip.TipoId = 1;

     


    AMB

    Some guidelines for posting questions...

    jueves, 10 de febrero de 2011 20:30

Todas las respuestas

  • Para eso esta el parametro @debug, para que le pases valor 1 y puedas ver la sentencia creada. Luego copias esa sentencia y tratas de ejecutarla para ver que pasa.

    Que pasa si ejecutas esta sentencia:

    SELECT
        usua.Login,   pub.PublicacionesVehiculoId, pub.Titulo, pub.Precio, pub.Ano, pub.Kilometraje,
        pub.TraccionIndependiente, pub.Transmision, est.Estado, mon.Simbolo
    FROM
        veh.PublicacionesVehiculos pub 
        INNER JOIN usr.Usuarios usua ON pub.UsuarioId = usua.UsuarioId
        INNER JOIN veh.PublicacionesAutomoviles aut ON pub.PublicacionesVehiculoId = aut.PublicacionVehiculoId
        INNER JOIN dbo.Regiones reg ON pub.RegionId = reg.RegionId
        INNER JOIN dbo.Estados est ON reg.EstadoId = est.EstadoId
        INNER JOIN veh.ModelosVehiculos mod ON aut.ModeloId = mod.ModeloId
        INNER JOIN veh.MarcasVehiculos mar ON mod.MarcaId = mar.MarcaId
        INNER JOIN veh.TiposVehiculos tip ON mar.TipoId = tip.TipoId
        INNER JOIN dbo.Monedas mon ON pub.MonedaId = mon.MonedaId
    WHERE
        tip.TipoId = 1;

     


    AMB

    Some guidelines for posting questions...

    jueves, 10 de febrero de 2011 20:30
  • Para eso esta el parametro @debug, para que le pases valor 1 y puedas ver la sentencia creada. Luego copias esa sentencia y tratas de ejecutarla para ver que pasa.

    Que pasa si ejecutas esta sentencia:

    SELECT
        usua.Login,   pub.PublicacionesVehiculoId, pub.Titulo, pub.Precio, pub.Ano, pub.Kilometraje,
        pub.TraccionIndependiente, pub.Transmision, est.Estado, mon.Simbolo
    FROM
        veh.PublicacionesVehiculos pub 
        INNER JOIN usr.Usuarios usua ON pub.UsuarioId = usua.UsuarioId
        INNER JOIN veh.PublicacionesAutomoviles aut ON pub.PublicacionesVehiculoId = aut.PublicacionVehiculoId
        INNER JOIN dbo.Regiones reg ON pub.RegionId = reg.RegionId
        INNER JOIN dbo.Estados est ON reg.EstadoId = est.EstadoId
        INNER JOIN veh.ModelosVehiculos mod ON aut.ModeloId = mod.ModeloId
        INNER JOIN veh.MarcasVehiculos mar ON mod.MarcaId = mar.MarcaId
        INNER JOIN veh.TiposVehiculos tip ON mar.TipoId = tip.TipoId
        INNER JOIN dbo.Monedas mon ON pub.MonedaId = mon.MonedaId
    WHERE
        tip.TipoId = 1;

     


    AMB

    Some guidelines for posting questions...

    Hola como te va...

    Si era lo del parametro TipoId... Es que yo lo coloque asi porque ese parametro de busqued es fijo, entonces pense colocarlo alli, pero luego de analizar varias veces me di cuenta que alli es el error al parecer no se puede asi o yo no supe hacerlo y tuv q hacerlo como los otros... Es decir,

    SELECT @sql = @sql + ' AND cam.TipoId = @xTipoId'

    Tu fuiste el mismo que ayer me hablo de esto, en verdad me ayudo muchisimo gracias por eso, luego le hare varias pruebas de performance a ver que tal se porta...

    jueves, 10 de febrero de 2011 21:26