none
Como llamar una tabla usando parametros RRS feed

  • Pregunta

  • Tengo un SELECT en el cual necesito llamar una tabla utilizando parametros..

    Ejemplo..:        select * from JR20092019050  where clave_sucursal=20

      Sucede que los primeros 8 digitos de la tabla es la fecha del archivo, y hay es que necesito colocar un parámetros el cual sea digitado, 

    ejemplo..:     select * from JR@Archivo050  where clave_sucursal=20

    Lo he puesto entre comillas doble y simple y nada...  de esta forma ...   select * from "JR@Archivo050"  where clave_sucursal=20

    Pero esto no me esta funcionando cuando realizo la corrida...   Quien puede darme una mano.

     

    lunes, 24 de junio de 2019 20:25

Todas las respuestas

  • Amigo por que no concatenas el query? creo que podrías solucionarlo de la siguiente forma:

    var tabla = "JR@Archivo050";

    var valor = 20;

    var query = "select * from " +tabla+ "where clave_sucursal=" + valor;

    lunes, 24 de junio de 2019 20:33
  • Hola Eddy_11:

    No expongas tu base de datos a Sql_injection.

    Tienes opciones más seguras y simples. Te pongo un ejemplo completo.

    CREATE TABLE JR20092019050
    (CLAVE_SUCURSAL INT, 
     DESCRIPCION    VARCHAR(100)
    );
    GO
    INSERT INTO JR20092019050
    (CLAVE_SUCURSAL, 
     DESCRIPCION
    )
    VALUES
    (20, 
     'DESCRIPCION'
    );
    GO
    ALTER PROCEDURE SP_NOMTABLE
    (@FECHA          VARCHAR(100), 
     @CLAVE_SUCURSAL INT
    )
    AS
    
         DECLARE @SQL NVARCHAR(4000);
         SET @SQL = N'SELECT * FROM JR' + CAST(@FECHA AS NVARCHAR(100)) + N' WHERE CLAVE_SUCURSAL = ' + CAST(@CLAVE_SUCURSAL AS NVARCHAR(2)) + N';';
         EXEC SP_EXECUTESQL 
              @SQL;
         RETURN;

    Con la tabla creada y un procedimiento almacenado, que me permite ejecutar código sql, y no exponer tán a la ligera la base de datos.

            var ConnectionString = @"Persist Security Info=False;Integrated Security=true;Initial Catalog=ejTres;Server=ESQUINERO";
    
                string query = "SP_NOMTABLE";
                string fecha = "20092019050"; 
                int clave = 20; 
    
                using (SqlConnection connection = new SqlConnection(ConnectionString))
                {
                    connection.Open();
                    SqlCommand cmd = new SqlCommand(query, connection);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add("@FECHA", SqlDbType.NVarChar,100);
                    cmd.Parameters.Add("@CLAVE_SUCURSAL", SqlDbType.Int);
                    cmd.Parameters[0].Value = fecha;
                    cmd.Parameters[1].Value = clave;
                    
                    SqlDataReader sqlReader = cmd.ExecuteReader();
                    while (sqlReader.Read())
                    {
                        MessageBox.Show(String.Format("Clave_Sucursal {0}, Descripcion {1}",sqlReader["CLAVE_SUCURSAL"],sqlReader["DESCRIPCION"]));
                    }
                }

    Le paso parámetros con el nombre de la tabla y el valor del where y es el procedure, el que consulta.

    lunes, 24 de junio de 2019 21:17
  • gracias por la ayuda.....     

    no es algo tan complicado...    es solo un Select para una consulta a una tabla. pero que sucede, que estas tablas se generan automaticamente con la fecha del dia y agregando el prefijo VWJRL delante...

    Por ejemplo:   VWJRL2406201900550        esta es la tabla correspondiente al dia de ayer.

    Esta consulta la estoy realizando en SQL Server Reporting Services.... y es de la siguiente forma..:

    SELECT        C55016 AS Id_Cliente, C55035 AS Nombre_Cliente, C55011 AS Producto, C55003 AS Fecha, COUNT(C55012) AS Cant_Trx, SUM(C55012) AS Monto_Trx
    FROM            MONITORH.dbo.VWJRL2406201900550 AS Transacciones
    WHERE        (C55006 = '337' OR
                             C55006 = '300' OR
                             C55006 = '457') AND (C55040 = 'N') AND (C55003 = 20190624)
    GROUP BY C55016, C55035, C55011, C55003

    Si te das cuenta, esa consulta me corre bien, pero quiero introducir una parametro que cuando yo dijite la fecha me busque esa tabla de ese día, y eso es con un parametro...

    SELECT        C55016 AS Id_Cliente, C55035 AS Nombre_Cliente, C55011 AS Producto, C55003 AS Fecha, COUNT(C55012) AS Cant_Trx, SUM(C55012) AS Monto_Trx
    FROM            MONITORH.dbo.VWJRL@ARCHIVO00550 AS Transacciones
    WHERE        (C55006 = '337' OR
                             C55006 = '300' OR
                             C55006 = '457') AND (C55040 = 'N') AND (C55003 = 20190624)
    GROUP BY C55016, C55035, C55011, C55003 

    *******Si te das cuenta @ARCHIVO va a tener la fecha que yo quiera y automaticamente tiene que buscarme los datos.

    Cuando corres el reporte te pide digitar ARCHIVO y hay es que introduce la fecha para que pueda buscar o realizar la extraccion de datos.

    martes, 25 de junio de 2019 14:00
  • Hola Eddy_11:

    No se trata de que sea complicado, sino de que donde tu pones una variable, yo la capturo al vuelo y puedo cambiar la idea de tu sentencia por algo que no te habías ni planteado.

    http://oscarsotorrio.com/post/2013/01/30/ataques-sql-injection.aspx

    En sql server las sentencias contra los objetos no pueden ser literales, tienen que ser nombres de objetos. Si quieres hacer un literal tienes que realizar una ejecución dinámica.

    Si quieres exponer así tu código, entonces le pasas la ejecución dinámica como literal. 

    O lo que es lo mismo string micadena = @"declare @sql NVARCHAR(4000); SET @SQL = N'aqui dentro tu sentencia ';

    exec sp_executeSql @sql"

    Pero no deberías.

    martes, 25 de junio de 2019 15:26