none
Duda sobre cómo reemplazar el nombre de una tabla en un query con un parámetro RRS feed

Respuestas

  • Hola.

    Creo que aquí se está confundiendo una variable de tipo tabla con preparar un script (procedimiento almacenado, función, etc) en el que el nombre de la tabla en la que se inserten los datos sea un parámetro.

    Eso, generalmente, es un error conceptual que penaliza notablemente el rendimiento y obliga al empleo de SQL dinámico, con los graves riesgos que ello entraña. A primera vista puede parecer que se ahorre en tiempo de desarrollo, pero no se gana tanto y se genera una aplicación nada robusta.

    Mi recomendación es preparar un procedimiento almacenado (no una función) que realice ese "insert .. select" para cada tabla que lo requiera. También se pueden facilitar más datos acerca de la funcionalidad concreta que se debe cubrir, a ver si es posible dar una recomendación más afinada al caso.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    • Marcado como respuesta Eder Costa martes, 21 de agosto de 2012 12:26
    viernes, 17 de agosto de 2012 11:42
    Moderador

Todas las respuestas

  • 1.- Que le estás pasando de parametro a tu variable ?

    2.- Ese error no te sale por esos parentesis??? a mi me funciona sin parentesis ( obviamente son mis tablas, prueba cambiandolas por las tuyas :) )

    declare @tabla table ( campo  varchar(30) )
    declare @var as varchar(30)
    declare @sql as nvarchar(50)
    
    set @var= 'catAreasDet'
    set @sql = 'SELECT top 1 cveArea FROM ' + @var  
    
    insert into  @tabla
    execute sp_executesql @sql
    
    select * from @tabla;

    3.- Hasta donde tengo entendido( y si me equivoco corrijanme por favor ) no puedes hacer INSERT INTO en una FUNCION.

    SALUDOS AMIGO


    jueves, 16 de agosto de 2012 16:46
  • 1.- Le paso el nombre de la tabla

    2.- Así lo tengo 

    	declare @sql varchar(max)	
    	set @sql = 'Select id from '+ @otable
    	
    	INSERT INTO @tempTable 
    	EXECUTE sp_executesql @sql 
    Y me marca  Invalid use of a side-effecting operator 'INSERT EXEC' within a function, @tempTable es la tabla que regreso :S



    -


    • Editado Miguel__GD jueves, 16 de agosto de 2012 17:21
    jueves, 16 de agosto de 2012 16:59
  • Parece que está programando una función.  Las funciones no tienen permitido el uso de INSERT y otros comandos que afectan datos.

    Jose R. MCP
    Code Samples

    jueves, 16 de agosto de 2012 17:37
  • Entiendo esa parte, pero en este caso mi función es de tipo tabla y el return regresa una tabla, en este caso @tempTable. Me imagino que aquí el problema es que no se puede usar EXECUTE en una función.



    -

    jueves, 16 de agosto de 2012 17:44
  • Así es.  Parece que esa sintaxis particular no está permitida ni en funciones de tabla.  Deberá buscar una ruta alterna, como convertir esa función a procedimiento almacenado, o bien tratar de concebir un diseño de base de datos completamente distinto que no dependa de obtener un nombre de tabla como parámetro.

    Jose R. MCP
    Code Samples

    jueves, 16 de agosto de 2012 17:55
  • Hola.

    Creo que aquí se está confundiendo una variable de tipo tabla con preparar un script (procedimiento almacenado, función, etc) en el que el nombre de la tabla en la que se inserten los datos sea un parámetro.

    Eso, generalmente, es un error conceptual que penaliza notablemente el rendimiento y obliga al empleo de SQL dinámico, con los graves riesgos que ello entraña. A primera vista puede parecer que se ahorre en tiempo de desarrollo, pero no se gana tanto y se genera una aplicación nada robusta.

    Mi recomendación es preparar un procedimiento almacenado (no una función) que realice ese "insert .. select" para cada tabla que lo requiera. También se pueden facilitar más datos acerca de la funcionalidad concreta que se debe cubrir, a ver si es posible dar una recomendación más afinada al caso.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    • Marcado como respuesta Eder Costa martes, 21 de agosto de 2012 12:26
    viernes, 17 de agosto de 2012 11:42
    Moderador
  • Segun entiendo quieres esto

    declare @sql nvarchar(400), @tabla nvarchar(100)
    set @tabla = N'tabla_b'
    set @sql = N'insert into tabla_A select * from ' + @tabla
    execute sp_executesql @sql

    Pero como te dijo qwalgrande, es una pésima idea esto..

    sábado, 18 de agosto de 2012 16:58