none
quiero hacer una consulta de este tipo RRS feed

  • Pregunta

  • hola a todos:

    requiero de su valiosa ayuda, estoy haciendo un aplicación en asp.net donde tengo un textbox y ahí van a meter unas variables ejemplo V20,V52,V752 (estas serian mi nombre en las columnas de mi tabla SQL server ) , y que estas pasen como parámetros a una consulta SQL por ejemplo 

    select @param1, @param2,@param3 from tabla
    
    /* donde @param1 son los datos ingresados en el textbox del asp.net*/
    
    de antemano mil gracias

    miércoles, 7 de octubre de 2020 13:28

Todas las respuestas

  • Hola Richard_Zalo:

    Eso requiere de sql dinámico.

    Create table myTable (id int, col1 varchar(100), col2 varchar(100), col3 varchar(100))
    go
    Insert into myTable (id, col1, col2, col3) 
    values
    (1,'a1','b1','c1'),
    (2,'a2','b2','c2'),
    (3,'a3','b3','c3'),
    (4,'a4','b4','c4');
    go

    Con el escenario creado.

    declare @param1 nvarchar(128);
    declare @param2 nvarchar(128);
    set @param1 = N'col2';
    set @param2 = N'col3';
    
    --- Como se hace
    Declare @sql nvarchar(4000);
    Set @sql = N'
    	SELECT '+ @param1+','+@param2+' FROM myTable;';
    
    Exec sp_Executesql @sql;

    Realmente se monta una cadena con la consulta en la variable @sql que contiene la misma, más lo que le llega como parámetros y se ejecuta utilizando Exec sp_executeSql

    exec sp_executeSql

    https://docs.microsoft.com/es-es/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql?view=sql-server-ver15

    miércoles, 7 de octubre de 2020 16:10
  • Te voy a proponer otra opción distinta.

    Como ya has visto en la respuesta anterior, los parámetros solo se pueden usar para los valores de la sentencia, pero no para los nombres de campos (ni nombres de tabla ni nada por el estilo). Cuando esto ocurre, hay que concatenar esos parámetros en una cadena de texto, y a continuación ejecutar esa cadena usando EXEC o con sp_exeutesql como se indica en la respuesta anterior.

    Esto tiene un inconveniente, y es que ese mecanismo es susceptible de ataques de inyección de SQL si no saneas los parámetros antes de pasárselos al SQL.

    Pues bien, ya puestos a tener que sanear los parámetros y tenerlos que concatenar en una cadena, y dado que hablas acerca de un textbox por lo que podemos presumir que estás programando el código cliente y por lo tanto no estás limitado a usar únicamente SQL, entonces ¿por qué no hacer esta misma concatenación en el lado cliente, en lugar de hacerla en SQL?

    Simplemente en tu lado cliente toma los nombres de las columnas, comprueba que no contengan inyecciones de SQL (cosa que de todas maneras deberías hacer aunque hagas la concatenación en el lado servidor) y concaténalos en la sentencia SQL. Después mandas a ejecutar la sentencia así construida mediante un ExecuteReader o un DataAdapter. La ventaja de hacerlo en lado cliente en lugar del lado servidor es que tienes un lenguaje más potente y además probablemente estás más familiarizado con él que con el lenguaje de lado servidor. Y de cara a la seguridad, eficiencia y rendimiento, el resultado va a ser el mismo, así que ¿por qué no hacerlo en el lado en el que tienes mayores facilidades de programación?

    miércoles, 7 de octubre de 2020 16:37