sql >> Base de Datos >  >> RDS >> Mysql

Declaración de preparación de MySql:¿es posible parametrizar el nombre de la columna o el nombre de la función?

no puedes parametrizar columna/tabla/nombre de función/alias. Como, PREPARE La declaración solo permite que la parte de "valores" de la consulta SQL se use como parámetros. Función/Tabla/Nombre de columna/alias se utilizan para determinar la validez de la instrucción SQL; y por lo tanto no se puede cambiar durante la ejecución en tiempo de ejecución. Cambiarlo en el momento de la ejecución alteraría potencialmente si la instrucción SQL era válida.

Puedes pensar en ello como compilar un código; por lo tanto, el compilador debe conocer todos los nombres de funciones/clases, etc. para crear un ejecutable válido (sí, podemos hacer clases dinámicas, pero eso es raro ). Por otro lado, podemos cambiar los "valores" de entrada al programa, pero generalmente no podemos cambiar las operaciones a realizar en los datos de entrada.

Además, el servidor MySQL consideraría los parámetros como literales y aplicaría comillas alrededor de ellos antes de usarlos en la ejecución de consultas.

Ahora, en su caso, aún puede usar el nombre de la función como parámetro para el procedimiento almacenado y generar la cadena de consulta con eso. Pero no puede usarlo como parámetro para la consulta en sí.

delimiter $$
create procedure test(in func varchar(20), in col varchar(20))
  begin

    set @c = col;

    -- use concat function to generate the query string using func parameter
    set @sql = concat('select ', func, '(?) from table');

    -- prepare the statement
    prepare stmt from @sql;

    -- execute
    execute x using @c;

    -- don't forget to deallocate the prepared statement
    deallocate prepare stmt;
  end$$
delimiter ;