none
Pasar nombre de tabla a un cursor... RRS feed

  • Pregunta

  • Hola, que tal. Buen dia... espero que alguien pueda ayudarme con mi problema...

    tengo un cursor... que recibe parametros... pero yo quiero que el nombre del a tabla sea igual un parametro... como puedo hacer esto...

    Tengo algo mas o menos asi...

    declare CD_PASO cursor for 
     
    SELECT * FROM @tabla_se  
    WHERE LIKE @estado_se  
     
    open CD_PASO 

    La variable... @estado_se no hay problema, si pasa. Pero en la de @tabla_se no me deja, sale el siguiente error.

    Msg 1087, Level 15, State 2, Procedure llena_paso, Line 28

    Debe declarar la variable de tabla "@tabla_se".

    Alguien me puede ayudar con esto?? de verdad... mil gracias!


    El verdadero significado de las cosas esta al tratar de decir las mismas cosas con otras palabras
    viernes, 6 de febrero de 2009 19:38

Respuestas

  • Hola.

    Por un lado, lo de "CREATE TABLE AS (CONSULTA SQL)" se consigue con una sentencia "Select campo1, campo2, ... into MiNuevaTabla from MiTablaDeOrigen".

    Con respecto a lo que deseas hacer, sería mejor opción crear primero y aparte la tabla (con su clave primaria, etc) y luego cargarla con varias consultas, si es posible fijas o parametrizando los campos 

    insert MiNuevaTabla (campo1, campo2, ...)
    select campo1, campo2
    from MiTablaOrigen_1
    where campo3 = @parametro

    insert MiNuevaTabla (campo1, campo2, ...)
    select campo1, campo2
    from MiTablaOrigen_2
    where  campo3 = @

    Nos dices.

    Alberto López Grande.
    • Marcado como respuesta NaviChavez lunes, 9 de febrero de 2009 4:42
    sábado, 7 de febrero de 2009 12:16
    Moderador

Todas las respuestas

  • Hola.

    Voy a intentar ayudarte. Con el debido respeto, lo que pretendes hacer es una barbaridad. Los cursores penalizan el rendimiento, casi siempre es mejor pensarlo un poco más para encontrar una forma de hacer lo mismo, pero de una forma mucho más eficaz. Y montar una estructura que realice la misma operación (u operaciones) pero para una serie de tablas, tampoco es nada recomendable, ya que para cada tabla habría que determinar la forma más idónea de consultarla, en función de sus índices, su tamaño, etc.

    Así que, intentando ayudarte, ¿puedes decirnos qué funcionalidad precisas cubrir a ver si te damos alguna idea de cómo llevarla a cabo?

    Alberto López Grande.
    viernes, 6 de febrero de 2009 20:48
    Moderador
  • Si, tienes toda la razón. Bueno, realmente no se mucho de bases de datos, pero trato de cargar mas del lado del servidor que del lado del cliente.

    La idea es unicamente llenar una tabla con la consulta a diferentes tablas (algo tipico, ¿no?) solo es una consulta basica que agrupa, suma y cuenta... y eso es lo que pretendo almacenar en la tabla (digamos... temporal, pero no debe ser temporal es una tabla fija). De verdad si me puedes orientar sobre cual es la forma correcta de hacer este tipo de procedimientos sencillos te estaria muy agradecido.

    Quiza... se puede hacer algo asi como un... CREATE TABLE AS (CONSULTA SQL) o algo asi habia pensado... no se si se pueda, pero... bueno... espero que puedas ayudarme. Aun asi, yo continua investigando ahora con la idea de que los cursores son la ultima opcion y no la unica.

    Gracias por todo.
    El verdadero significado de las cosas esta al tratar de decir las mismas cosas con otras palabras
    sábado, 7 de febrero de 2009 7:01
  • Hola.

    Por un lado, lo de "CREATE TABLE AS (CONSULTA SQL)" se consigue con una sentencia "Select campo1, campo2, ... into MiNuevaTabla from MiTablaDeOrigen".

    Con respecto a lo que deseas hacer, sería mejor opción crear primero y aparte la tabla (con su clave primaria, etc) y luego cargarla con varias consultas, si es posible fijas o parametrizando los campos 

    insert MiNuevaTabla (campo1, campo2, ...)
    select campo1, campo2
    from MiTablaOrigen_1
    where campo3 = @parametro

    insert MiNuevaTabla (campo1, campo2, ...)
    select campo1, campo2
    from MiTablaOrigen_2
    where  campo3 = @

    Nos dices.

    Alberto López Grande.
    • Marcado como respuesta NaviChavez lunes, 9 de febrero de 2009 4:42
    sábado, 7 de febrero de 2009 12:16
    Moderador
  • Vale... eso ya lo había pensado, ahora... el principal problema es que el nombre de la tabla no esta definido. Como puede ser 1, 2, 3... n es por eso que yo con un solo procedimiento quería hacer que se llenara la tabla. Como te comento la idea es que se pueda hacer esto para una tabla o para dos o para n numero de tablas.

    Crees conveniente para el rendimiento... hacer esto que me dices con una serie de IF o existe alguna otra solución? serian... aproximadamente 13 condiciones... pero, esto seria solamente durante un ciclo, o sea, que tendriamos solo 1 de 13.

    Mil gracias por el tiempo dedicado.

    El verdadero significado de las cosas esta al tratar de decir las mismas cosas con otras palabras
    sábado, 7 de febrero de 2009 17:22
  • Hola.

    Hay que intentar encontrar un equilibrio entre el rendimiento y el tiempo de desarrollo. Si son 13 condiciones, yo haría 13 procedimientos almacenados. Si sólo "te dejan" hacer uno, crea uno más que encapsule la llamada a los otros 13. No será lo más idóneo para el rendimiento, pero comparado con el empleo de cursores para generar sql dinámico es mucho mejor.

    Alberto López Grande
    domingo, 8 de febrero de 2009 18:52
    Moderador
  • 13 procedimientos almacenados...?? mmm... Vale, ya entendi lo de los cursores. Pero... bueno... creo que ya entendi el buen camino para la programacion en las bases de datos. Gracias por todo... de maravilla la ayuda!!! en verdad...!
    El verdadero significado de las cosas esta al tratar de decir las mismas cosas con otras palabras
    lunes, 9 de febrero de 2009 4:42