none
sql dinámico error en variable RRS feed

  • Pregunta

  • Hola buenas noches. 

    Queria pedir ayuda para resolver esta problemática. 

    resulta que estoy entendiendo con las consultas dinámicas y no he logrado obtener resultados.

    Resulta que dentro de un procedimiento almacenado tengo declarado las siguientes variables.

    @usuario nvarchar(30)='CATALINA',
    @Finicio as datetime=null,
    @Ffin as datetime=null


    y la construccion del sql dinamico comienza así.

    Declare @sql nvarchar(max)
    
    Set @sql='
    SET DATEFIRST 7;
    with cst as (
    select
    	[Cl_Fanta] as Cliente
    ,[Nome] as Razon_Social
    ,[ExpoNome] as VendedorExpo
    ,[ImpoNome] as VendedorImpo

    El tema puntual es que cuando aplico un filtro en where pero en duro como el que sigue :

    		   where (b.vendedor=''CATALINA'') -- Filtro en cuestión
    		   group by  rollup(control),b.produto,month(b.Data)


    funciona correctamente, pero cuando intento pasar la variable @usuario no funciona.

    where (b.vendedor='''+@usuario+''') -- Filtro en cuestión
    		   group by  rollup(control),b.produto,month(b.Data)

    La sentencia que utilizo para ejecutar el texto de la consulta es EXECUTE sp_executesql @sql.

    Desde ya muchas gracias. 

    lunes, 16 de marzo de 2020 23:28

Respuestas

  • No es por la variable, eso funciona igual.

    Puedes cambiar el filtro y en vez de utilizar fechas, hacerlo por cualquier columna numérica, y te funcionará bien. 

    Es un problema de la query.

    declare @usuario nvarchar(30)='CATALINA';
    declare @Finicio as datetime=null;
    Declare @sql nvarchar(max)
    set @finicio = GETDATE();
    
    set @usuario =  convert(varchar(10), @Finicio, 120);
    Set @sql='
    SET DATEFIRST 7;
    with cst as (
    select
    	cast(GETDATE() as date) as fecha
    	from (values (1))tbl(fecha)
    	)
    	select * from cst
    where (fecha='''+@usuario+''') -- Filtro en cuestión
    		   ';
    
    exec sp_executesql @sql

    Esta es exactamente tú query pero simplificada a una sola fecha, en el conjunto de la tabla de expresión común, la de hoy y se filtra por el contenido de la variable.

    Tienes que tener algún pequeño "agujerito" que se te está escapando.

    No obstante si ya lo has solucionado con una variable.


    • Marcado como respuesta jcc2018 martes, 17 de marzo de 2020 16:58
    martes, 17 de marzo de 2020 14:29
  • Gracias,

    Lo que sucede que es un una query con unas tablas de uso privado, solo por ellos coloque un extracto. 

    where B.[Data]>='''+ convert(varchar(10), @Finicio, 120) +''' and b.[Data]<='''+convert(varchar(10), @Ffin, 120)+'''
    		   '+ convert(varchar(30), @FilterUsuario, 120)+'

    Finalmente lo resolvi con un convert(varchar(30), mivariable,120).

    la variable

    @FilterUsuario

    va en remplazo de la @usuario.

    Pero me sigue quedando la duda del porque si dejo la variable insitu no funciona. 

    gracias.

    • Marcado como respuesta jcc2018 martes, 17 de marzo de 2020 16:58
    martes, 17 de marzo de 2020 12:27

Todas las respuestas

  • Hola

     

    Gracias por levantar tu consulta en los foros de MSDN. Analizaremos su pregunta y vamos a darle seguimiento para buscar la mejor repuesta pertinente al caso.

     

    Gracias por usar los foros de MSDN.

     


    Jordy Quiros

     ____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    martes, 17 de marzo de 2020 0:24
    Moderador
  • Hola jcc2018:

    declare @usuario nvarchar(30)='CATALINA';
    declare @Finicio as datetime=null;
    declare @Ffin as datetime=null;
    Declare @sql nvarchar(max)
    
    Set @sql='
    SET DATEFIRST 7;
    with cst as (
    select
    	[Cl_Fanta] as Cliente
    ,[Nome] as Razon_Social
    ,[ExpoNome] as VendedorExpo
    ,[ImpoNome] as VendedorImpo
    where (b.vendedor='''+@usuario+''') -- Filtro en cuestión
    		   group by  rollup(control),b.produto,month(b.Data)';

    Esta es la query dinámica que has pegado. 

    Si este es el ejemplo no puede funcionar porque no has terminado el cst.

    print @sql

    Imprime la query antes de ejecutarla. 

    SET DATEFIRST 7;
    with cst as (
    select
    [Cl_Fanta] as Cliente
    ,[Nome] as Razon_Social
    ,[ExpoNome] as VendedorExpo
    ,[ImpoNome] as VendedorImpo
    where (b.vendedor='CATALINA') -- Filtro en cuestión
       group by  rollup(control),b.produto,month(b.Data)

    Si la observas el conjunto cst no esta cerrado

    Es muy posible, que sean errores de copia pega en el hilo, pero las querys dinámicas, son muy susceptibles de cometer este tipo de errores.

    martes, 17 de marzo de 2020 11:25
  • Gracias,

    Lo que sucede que es un una query con unas tablas de uso privado, solo por ellos coloque un extracto. 

    where B.[Data]>='''+ convert(varchar(10), @Finicio, 120) +''' and b.[Data]<='''+convert(varchar(10), @Ffin, 120)+'''
    		   '+ convert(varchar(30), @FilterUsuario, 120)+'

    Finalmente lo resolvi con un convert(varchar(30), mivariable,120).

    la variable

    @FilterUsuario

    va en remplazo de la @usuario.

    Pero me sigue quedando la duda del porque si dejo la variable insitu no funciona. 

    gracias.

    • Marcado como respuesta jcc2018 martes, 17 de marzo de 2020 16:58
    martes, 17 de marzo de 2020 12:27
  • No es por la variable, eso funciona igual.

    Puedes cambiar el filtro y en vez de utilizar fechas, hacerlo por cualquier columna numérica, y te funcionará bien. 

    Es un problema de la query.

    declare @usuario nvarchar(30)='CATALINA';
    declare @Finicio as datetime=null;
    Declare @sql nvarchar(max)
    set @finicio = GETDATE();
    
    set @usuario =  convert(varchar(10), @Finicio, 120);
    Set @sql='
    SET DATEFIRST 7;
    with cst as (
    select
    	cast(GETDATE() as date) as fecha
    	from (values (1))tbl(fecha)
    	)
    	select * from cst
    where (fecha='''+@usuario+''') -- Filtro en cuestión
    		   ';
    
    exec sp_executesql @sql

    Esta es exactamente tú query pero simplificada a una sola fecha, en el conjunto de la tabla de expresión común, la de hoy y se filtra por el contenido de la variable.

    Tienes que tener algún pequeño "agujerito" que se te está escapando.

    No obstante si ya lo has solucionado con una variable.


    • Marcado como respuesta jcc2018 martes, 17 de marzo de 2020 16:58
    martes, 17 de marzo de 2020 14:29