locked
Stored procedure usar nombre de tabla por medio de parametro RRS feed

  • Pregunta

  • hola.

    he intentado crear un stored procedure con un simple select donde la tabla sea un parametro pero me ecuentro con un error el cual dice que @Tabla no esta definido .

    CREATE PROCEDURE [dbo].[SelectRegistro]
        @Tabla as varchar(50)
    AS

    BEGIN

       SET NOCOUNT ON;
        SELECT * from  @Tabla 

    END
    GO

    es algo aparentemente simple pero no encuentro solucion, lo unico que se me ocurrio fue hacerlo con condicionales pero quiero saber si se puede con parametros como lo mencione anteriormente, aluna idea de como se hacerlo ?, la razon  de esto es crear un stored procedure dinamico donde yo le pase todos parametros, porque al paso que voy voy a tener que crear mil stored procedures .

    alguien me puede iluminar.

    muchas gracias.

    jueves, 29 de marzo de 2012 16:09

Respuestas

  • ¿Y qué ventaja tendría entonces tener un procedimiento así? Tiene más sentido construir la instrucción desde la aplicación cliente en vez de tener un único procedimiento al que le pasas como parámetro la instrucción a ejecutar

    Además de otros aspectos, una de las principales ventajas que tienen los procedimientos almacenados es la encapsulación. Es decir, que son un envoltorio para ejecutar procesos concretos: consultar una tabla en base a unos criterios de filtrado, actualizar datos de una para pasarlos a otra, etc. etc. Eso puede suponer tener un par de procedimientos o cientos de ellos, pero el hecho de tener que crear muchos no debería ser razón por la cual plantearte crear uno tan genérico que fuera capaz de todo

    jueves, 29 de marzo de 2012 16:24
  • Bueno, no he buscado mucho en la red pero esto puede ser un punto de comienzo

    http://www.mssqltips.com/sqlservertutorial/160/sql-server-stored-procedure/

    Piensa en los procedimientos almacenados como en las funciones, han de tener una misión, generalmente la de encapsular logica de negocio. Por ejemplo si tienes que hacer un proceso de facturación en el que cada nota de entrega has de convertirlo en una factura en función de algún tipo de lógica de negocio, agrupando albaranes etc. El tema es que si eso lo haces dede la aplicación cliente, implica devolver por red todos las notas de entrega y generar muchas instrucciones SQL para generar las facturas. En este caso un procedimiento almacenado serviría para evitar viajes al servidor y para hacer el proceso más rápido. Además de eso la primera vez que lo ejecutes se generará un plan de ejecución (imagina una compilación de un programa) que será vuelto a usar tantas veces lo llames despues.

    Hay muchos más escenarios pero los iras aprendiendo con la experiencia.


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    jueves, 29 de marzo de 2012 19:54
    Moderador

Todas las respuestas

  • ¿Y qué ventaja tendría entonces tener un procedimiento así? Tiene más sentido construir la instrucción desde la aplicación cliente en vez de tener un único procedimiento al que le pasas como parámetro la instrucción a ejecutar

    Además de otros aspectos, una de las principales ventajas que tienen los procedimientos almacenados es la encapsulación. Es decir, que son un envoltorio para ejecutar procesos concretos: consultar una tabla en base a unos criterios de filtrado, actualizar datos de una para pasarlos a otra, etc. etc. Eso puede suponer tener un par de procedimientos o cientos de ellos, pero el hecho de tener que crear muchos no debería ser razón por la cual plantearte crear uno tan genérico que fuera capaz de todo

    jueves, 29 de marzo de 2012 16:24
  • Hola,

    Vea un ejemplo.

    -- Table 
    create table teste10
    (
     id int primary key,
     nome varchar(30)
    )
    go
    
    -- Type
    create type Type_TABLE as table
    (
     id int primary key,
     nome varchar(30)
    )
    go
    
    
    -- PROC
    create procedure SP_table_p
     @parameter_table Type_TABLE readonly
    as
    
     insert into teste10 (id, nome) select id, nome from @parameter_table
     
     select id, nome from teste10
    go
    
    
    -- Test
    declare @parameter_table as Type_TABLE;
    insert into @parameter_table values(1,'JOSE');
    exec dbo.SP_table_p @parameter_table
     go
    

    Saludos,
    jueves, 29 de marzo de 2012 16:26
  • gracias por responderme,

    bueno yo soy nuevo en programacion y me gustaria saber cuando usar o no un stored procedure. yo tengo entendido que un stored procedure se hace para poder reutilizarlo, pero veo que mi aplicacion se esta llenando de procediemtos almacenados, tal vez si sea mejor enviar la instruccion desde la aplicacion.

    voy a seguir investigando hacerca de este tema ya que no cuento el conocimiento suficiente como para saber cuando o no crear procedimeinto.

    muchas gracias.

    jueves, 29 de marzo de 2012 16:51
  • El uso de procedimientos almacenados en mi opinión se vincula a un tema de diseño y de estrategias contempladas para el manejo de operaciones CRUD(Create,Read,Update,Delete) así como temas de seguridad, inclusive como manejaras la gestión de la lógica de negocios en tu capa de datos.

    En principio te puedo mencionar que en efecto si son reutilizables y tienen una amplia cantidad de beneficios, pero tampoco tiene razón de ser por ejemplo que uses SP para tareas que perfectamente puedes realizar con vistas o funciones definidas por el usuario.

    Tener muchos procedimientos almacenados no es problema, es un proceso natural que depende de tu diseño y sobre todo de la amplitud de tu sistema, así que en principio eso no te deberia de representar problema.  Encontraras tambien opiniones en contra y a favor de su uso, te recomendaria leer un poco más sobre su uso para que vayas identificando por tu cuenta los escenarios que suelen ser mas propicios para su uso.

    Cualquier duda al respecto no dudes en consultarlo o escribirnos.


    "How many years can some people exist before they're allowed to be free" Bob Dylan Email: info@geohernandez.com Blog: geeks.ms/blogs/ghernandez

    jueves, 29 de marzo de 2012 17:05
  • muchas gracias por tu respuesta geovany , pues tomare tu consejo y seguire investigando .

    por ultimo si tienen algun buen link con fuentes de informacion sobre el tema seria aun mejor, yo ya estoy leyendo varios.

    gracias.

    jueves, 29 de marzo de 2012 19:31
  • Bueno, no he buscado mucho en la red pero esto puede ser un punto de comienzo

    http://www.mssqltips.com/sqlservertutorial/160/sql-server-stored-procedure/

    Piensa en los procedimientos almacenados como en las funciones, han de tener una misión, generalmente la de encapsular logica de negocio. Por ejemplo si tienes que hacer un proceso de facturación en el que cada nota de entrega has de convertirlo en una factura en función de algún tipo de lógica de negocio, agrupando albaranes etc. El tema es que si eso lo haces dede la aplicación cliente, implica devolver por red todos las notas de entrega y generar muchas instrucciones SQL para generar las facturas. En este caso un procedimiento almacenado serviría para evitar viajes al servidor y para hacer el proceso más rápido. Además de eso la primera vez que lo ejecutes se generará un plan de ejecución (imagina una compilación de un programa) que será vuelto a usar tantas veces lo llames despues.

    Hay muchos más escenarios pero los iras aprendiendo con la experiencia.


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    jueves, 29 de marzo de 2012 19:54
    Moderador
  • Saludos

    Geovanny (... Encontraras tambien opiniones en contra y a favor de su uso...) y Miguel (... El tema es que si eso lo haces dede la aplicación cliente, implica devolver por red todos las notas de entrega y generar muchas instrucciones SQL para generar las facturas. En este caso un procedimiento almacenado serviría para evitar viajes al servidor y para hacer el proceso más rápido. Además de eso la primera vez que lo ejecutes se generará un plan de ejecución (imagina una compilación de un programa) que será vuelto a usar tantas veces lo llames después. ...)

    Otro factor no menos importante es el tema seguridad. Podrías dar permisos sobre un SP que trabaje con varias tablas y no tener sobre cada tabla.

    Un cuanto a una fuente de información, utiliza los libros en pantalla.

    NOTA:

    1. Si buscas en internet o preguntas a programadores seguramente te dirán que no son necesarios los procedimientos almacenados o que si los utilizar, tus aplicaciones dejan de ser genéricas y un largo números de peros. Según mi experiencia, la utilización de los métodos propios de la base de datos (sp, views, functions,trigger,types, policies, etc), es la mejor de las opciones.
    2. Si estas empezando ve directo a sqlserver 2008 R2

    enviado por microsoft group

    viernes, 30 de marzo de 2012 17:26
  • Lo que quieres hacer no te lo da por que la ejecución de la sentencia no te lo interpreta como texto... Por lo que la solución si te sirve puede ser...

    CREATE PROCEDURE TEST
    @TABLA VARCHAR(20) = ''
    AS

    BEGIN
    SET NOCOUNT ON;
    DECLARE @CADENA VARCHAR(2000)

    SET @CADENA = 'SELECT * FROM '+@TABLA
    EXEC(@CADENA)

    END

    --test

    EXEC TEST 'nombre_tabla'

    Espero te funcione... Salu2

    • Propuesto como respuesta Canikin miércoles, 12 de agosto de 2015 22:06
    miércoles, 17 de octubre de 2012 21:45
  • excelente!!!! justo lo que andaba buscando muy buen aporte.
    miércoles, 12 de agosto de 2015 22:05
  • Excelente, me ayudo a resolver, 100pts
    martes, 21 de febrero de 2023 17:09