использовать переменную для имени таблицы в mysql sproc

Я пытаюсь передать имя таблицы в мою хранимую процедуру mysql, чтобы использовать этот sproc, чтобы выбрать разные таблицы, но он не работает …

это то, что я пытаюсь:

CREATE PROCEDURE `usp_SelectFromTables`( IN TableName varchar(100) ) BEGIN SELECT * FROM @TableName; END 

Я также пробовал это без знака @, и это просто говорит мне, что TableName не существует … что я знаю 🙂

Это зависит от СУБД, но для обозначения обычно требуется динамический SQL, и возникает проблема, что возвращаемые значения из функции зависят от входов при ее выполнении. Это дает системные связи. В качестве общего правила (и, следовательно, возможно, с учетом исключений) СУБД не позволяют использовать заполнители (параметры) для структурных элементов запроса, таких как имена таблиц или имена столбцов; они позволяют указывать такие значения, как значения столбцов.

У некоторых СУБД есть поддержка хранимых процедур, которые позволят вам создать строку SQL, а затем работать с ней, используя «подготовить» или «выполнить немедленные» или подобные операции. Обратите внимание, однако, что вы внезапно уязвимы для SQL-инъекций – кто-то, кто может выполнить вашу процедуру, может затем частично контролировать то, что SQL выполняет.

 SET @cname:='jello'; SET @vname:='dwb'; SET @sql_text = concat('select concept_id,concept_name,',@vname,' from enc2.concept a JOIN enc2.ratings b USING(concept_id) where concept_name like (''%',@cname,'%'') and 3 is not null order by 3 asc'); PREPARE stmt FROM @sql_text; EXECUTE stmt; DEALLOCATE PREPARE stmt; 

Дополнительный бит, который вызвал у меня проблемы.

Я хотел бы задать имя таблицы и поле динамически в запросе, как задал @kyle, но я также хотел сохранить результат этого запроса в переменной @a в запросе.

Вместо того чтобы помещать переменную @a в @a буквально, вам нужно включить ее как часть текста строки.

 delimiter // CREATE PROCEDURE removeProcessed(table_name VARCHAR(255), keyField VARCHAR(255), maxId INT, num_rows INT) BEGIN SET @table_name = table_name; SET @keyField = keyField; SET @maxId = maxId; SET @num_rows = num_rows; SET @sql_text1 = concat('SELECT MIN(',@keyField,') INTO @a FROM ',@table_name); PREPARE stmt1 FROM @sql_text1; EXECUTE stmt1; DEALLOCATE PREPARE stmt1; loop_label: LOOP SET @sql_text2 = concat('SELECT ',@keyField,' INTO @z FROM ',@table_name,' WHERE ',@keyField,' >= ',@a,' ORDER BY ',@keyField,' LIMIT ',@num_rows,',1'); PREPARE stmt2 FROM @sql_text2; EXECUTE stmt2; DEALLOCATE PREPARE stmt2; ...Additional looping code... END LOOP; END // delimiter ; 

Поэтому в @sql_text1 присвойте результат запроса @a внутри строки, используя:

') INTO @a FROM '

Затем в @sql_text2 используйте @a как действительную переменную:

,' WHERE ',@keyField,' >= ', @a ,' ORDER BY '

  • Обработка ошибок хранимой процедуры MySQL
  • Давайте будем гением компьютера.