none
CREAR UNA FUNCION ESCALAR DONDE LA TABLA DEL FROM SEA UNA VARIABLE RRS feed

  • Pregunta

  • Hola,

    Trabajo con SQL Server 2014 y tengo la siguiente duda:

    ¿es posible crear una función escalar de forma que su select ataque a una tabla denominada a través de un parámetro?

    En mi base de datos estoy probando a crear:

    CREATE FUNCTION [dbo].[PRUEBA10](@Idactivo as int, @TABLA AS TABLE)
    
    
    RETURNS nvarchar(150)  AS  BEGIN    
    return
    
    (    
    
    select NombreActivo 
    
    from @TABLA
    
    where  IdActivo=@Idactivo
    
    
    )      
    
    END 

    Pero obtengo el error de:

    Debe declarar la variable de tabla "@TABLA".

    Mi pregunta es ¿cómo debo declararla? 

    Muchas gracias

    Angel

    viernes, 21 de octubre de 2016 17:51

Respuestas

  • Angeleci,

    Respecto al requerimiento al que haces referencia, efectivamente podrías utilizar una función para obtener un valor y asignarlo a la columna calculada pero para eso no necesitas pasar el nombre de la tabla como parámetro.

    Sin embargo, pienso que si el valor de una columna es el resultado de un cálculo no es necesario persistirlo (a menos que el cálculo sea demasiado complejo y merezca la pena guardar el valor directamente), incluso -y leí que es una de las propuestas- podrías crear una vista con la columna "calculada" y consultar la vista en lugar de la tabla

    CREATE VIEW dbo.NombreVista
    AS
        SELECT 
    	   Col1, 
    	   Col2,
    	   <Expresion>
        
    /*Invocar a la vista*/
    SELECT * FROM dbo.NombreVista

    Como vez, la vista abstrae el cálculo de ciertas columnas y te permite tener disponible la información sin afectar la tabla base ni crear columnas que podrían ser perfectamente calculadas.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Laura CeglzModerator lunes, 24 de octubre de 2016 15:55
    • Marcado como respuesta Angeleci lunes, 24 de octubre de 2016 16:01
    viernes, 21 de octubre de 2016 19:06

Todas las respuestas

  • Angeleci,

    Para ejecutar una consulta donde el nombre de un objeto se define de manera dinámica debes hacer uso del procedimiento sp_executesql, pero entiendo que invocar a dicho procedimiento en una función no es posible. Te recomiendo explicar de manera amplia el requerimiento que tienes para analizar otras posibilidades. Por ejemplo, si tienes varias tablas que presentan las columnas NombreActivo e IdActivo podrías crear una vista conteniendo el nombre de la tabla como valor, por ejemplo:

    CREATE VIEW dbo.NombreVista
    AS
        SELECT IdActivo, NombreActivo, 'Tabla1' AS 'TableName' FROM dbo.Tabla1
        UNION ALL
        SELECT IdActivo, NombreActivo, 'Tabla2' FROM dbo.Tabla2
    
    
    /*Utilizar vista*/
    SELECT NombreActivo FROM dbo.NombreVista WHERE TableName = 'Tabla1' AND IdActivo = 1;


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 21 de octubre de 2016 18:23
  • Hola Willams,

    Te cuento.

    Realmente he barajado esta posibilidad de crear funciones con tabla como parametro intentando solventar el problema que he expuesto en este hilo:

    El problema es que tengo una tabla fisica cuyos campos he de actualizar utilizando procesos que requieren tablas CTES y uso de la clausula over. Igualmente al final de ese hilo planteo otra duda que supone otra alternativa a cómo solventar el problema o al menos intento de solución.

    Muchas gracias

    Angel

    viernes, 21 de octubre de 2016 18:42
  • Angeleci,

    Respecto al requerimiento al que haces referencia, efectivamente podrías utilizar una función para obtener un valor y asignarlo a la columna calculada pero para eso no necesitas pasar el nombre de la tabla como parámetro.

    Sin embargo, pienso que si el valor de una columna es el resultado de un cálculo no es necesario persistirlo (a menos que el cálculo sea demasiado complejo y merezca la pena guardar el valor directamente), incluso -y leí que es una de las propuestas- podrías crear una vista con la columna "calculada" y consultar la vista en lugar de la tabla

    CREATE VIEW dbo.NombreVista
    AS
        SELECT 
    	   Col1, 
    	   Col2,
    	   <Expresion>
        
    /*Invocar a la vista*/
    SELECT * FROM dbo.NombreVista

    Como vez, la vista abstrae el cálculo de ciertas columnas y te permite tener disponible la información sin afectar la tabla base ni crear columnas que podrían ser perfectamente calculadas.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Laura CeglzModerator lunes, 24 de octubre de 2016 15:55
    • Marcado como respuesta Angeleci lunes, 24 de octubre de 2016 16:01
    viernes, 21 de octubre de 2016 19:06