none
Usar una Tabla en una variable dentro de una funcion escalar SQL Server 2014 RRS feed

  • Pregunta

  • USE [JMG30VB01]
    GO
    /****** Object:  UserDefinedFunction [dbo].[FuncSalFinal]    Script Date: 18/01/2016 22:58:23 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- ===============================
    -- Author:		<Author,,Name>
    -- Create date: <Create Date, ,>
    -- Description:	<Description, ,>
    -- ===============================
    ALTER FUNCTION [dbo].[FuncSalFinal]
    (
    	@cuenta  nvarchar(30),
    	@fecFin date
    )
    RETURNS decimal(10,2)
    AS
    BEGIN
    	
    	DECLARE @ResultVar decimal(10,2)
    
    	
    	SELECT @ResultVar = SUM(m.cntDebito - m.cntCredito)
    	    FROM cntMaestro m
                WHERE m.cntCuenta= @cuenta and m.cntFecha <= @fecFin
    
            IF (@ResultVar IS NULL) 
            SET @ResultVar = 0;
    
    	-- Return the result of the function
    	RETURN @ResultVar
    
    END
    

    Hola a todos.

    tengo una serie de funciones como esta en mi Base de Datos en SQL Server 2014, por favor si alguien me ayuda comentandome la manera de que mi Tabla (cntMaestro) sea una variable, por ejemplo (cntMaestro2013) dependiendo el año en el cual el usuario este trabajando. Las tablas (cntMaestro2013) (cntMaestro2014) etc.. ya existen.

    Gracias de antemano por su ayuda.

    Saludos


    saludos.

    martes, 19 de enero de 2016 5:16

Respuestas

  • Creo que la solución sería que el cntMaestro tenga los registros de todos los años (incluido el registro inicial de cada año y los cálculos realizados para cada año). Pare que pueda contenerlos todos, tendrás que añadirle una columna adicional que sea el número de año. Y después, en todos los accesos a esa tabla, añadir un "... where año=@año", siendo @año el valor que seleccionó el usuario (que puede ser distinto para cada usuario aunque todos trabajen a la vez contra la misma tabla).
    miércoles, 20 de enero de 2016 6:15
    Moderador

Todas las respuestas

  • Los nombres de tabla no pueden ser variables. Para que en una Select se pueda parametrizar el nombre de la tabla, hay que recurrir a construir SQL dinámico, es decir, concatenar el texto de la sentencia dentro de una variable de tipo nvarchar, y luego ejecutar el contenido de la variable, bien sea con EXEC o con execute_sql. Sin embargo, me temo que dentro de una función escalar no te lo permitirá. Tendrás que refactorizar el código y utilizar algún otro tipo de objetos. Por ejemplo, cambiar las funciones por procedimientos almacenados, o hacer una función por cada tabla (por ejemplo, FuncSalFInal2013 para la tabla cntMaestro2013.

    Por esta y otras razones similares, normalmente se considera un mal diseño el ir cambiando el nombre de las tabas cada año. Es preferible usar una tabla para todos los años, y que dentro tenga un campo que sirva para distinguir cuál es el año al que se refiere cada registro. Eso sí que se podría filtrar con un "where" en las funciones.

    martes, 19 de enero de 2016 6:07
    Moderador
  • Alberto buen dia.

    gracias por tu respuesta, me aclara que no puedo usar tablas con nombres variables en una function escalar. Después de una larga lucha con mi función, acepté que así es.

    Tengo una Tabla (Maestro) que contiene la información de todos los años, mediante un procedimiento almacenado (que no solo copia la información sino realiza algunos cálculos y genera un registro inicial) recosnstruyo la nueva tabla(cntMaestro) que contiene la información del año que el usuario elije. Me funciona perfecto con una velocidad muy buena 133msg recreando la Tabla con aprox 86000 registros por año y las consultas son muy agiles. Todo esto en un ambiente mono usuario, el problema se presenta en un ambiente multiusuario cuando otro usuario cambia de año y entonces el primer usuario realiza consultas en un (cntMaestro) diferente.

    Espero haber explicado mi inconveniente y agradecería cualquier sugerencia para reorientar mi aplicación.

    Saludos cordiales,

    Jaime.


    saludos.

    miércoles, 20 de enero de 2016 0:46
  • Creo que la solución sería que el cntMaestro tenga los registros de todos los años (incluido el registro inicial de cada año y los cálculos realizados para cada año). Pare que pueda contenerlos todos, tendrás que añadirle una columna adicional que sea el número de año. Y después, en todos los accesos a esa tabla, añadir un "... where año=@año", siendo @año el valor que seleccionó el usuario (que puede ser distinto para cada usuario aunque todos trabajen a la vez contra la misma tabla).
    miércoles, 20 de enero de 2016 6:15
    Moderador