Как найти столбец с входными параметрами и обновить этот столбец? - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть ТАБЛИЦА, подобная этой:

CREATE TABLE TEST5 ([Id] INT, [A] BIT, [B] BIT, [C] BIT, [D] BIT, [E] BIT);
INSERT INTO TEST5 ([Id], [A], [C], [E]) VALUES (1, 'true', 'false', 'true')
INSERT INTO TEST5 ([Id], [A], [B], [C]) VALUES (2, 'true', 'true', 'true')
INSERT INTO TEST5 ([Id], [C], [D], [E]) VALUES (1, 'false', 'false', 'true')

Я хочу создать процедуру, которая будет принимать параметры (id INT, столбец char (1)).Если ячейка соответствует id и столбцу true / false, я должен инвертировать его.Иначе никаких изменений не сделано.Это то, что я сделал, но не смог бежать.Я использую mysql.

CREATE PROCEDURE invertValue(
    id INT,
    column char
)
BEGIN
UPDATE TABLEDB
SET column = SELECT a,b,c,d,e 
CASE column =
WHEN column = 'false' THEN 'true'
WHEN column = 'true' THEN 'false'
WHERE Id = id
END;

Но все, что у меня есть, это синтаксические ошибки.Пожалуйста, помогите!

1 Ответ

0 голосов
/ 17 февраля 2019

Похоже, вы смешиваете MS Sql и mysql.

Чтобы перевернуть значение BIT при совпадении ID, вы можете попробовать выполнить следующее.

UPDATE TEST5
SET A=NOT A, B= NOT B, C=NOT C, D=NOT D, E = NOT E
WHERE ID=1;
SELECT * FROM TEST5

Естьнесколько вопросов в вашем запросе.

  1. Не используйте [] для имени столбца в mysql.
  2. BIT может содержать только 0 или 1, а не 'true' и 'false'
  3. Вам не нужен входной параметр 'column'
  4. Не используйте зарезервированные ключевые слова в качестве имени параметра, например, 'column'.

Демонстрация

Редактировать:

Чтобы выбрать динамический столбец, вам нужно построить динамический sql следующим образом.

CREATE PROCEDURE invertValue(
    id INT,
    clm char
)
BEGIN
SET @t1 =CONCAT("UPDATE TEST5 SET ",clm,'= not ', clm," where ID=",id);
 PREPARE stmt3 FROM @t1;
 EXECUTE stmt3;
 DEALLOCATE PREPARE stmt3;

END;

SP Demo Online

Попробуйте свести к минимуму риск Уязвимость SQL-инъекции с помощью параметризованного динамического запроса, как показано ниже.

CREATE  PROCEDURE invertValue(
    id INT,
    clm char
)
BEGIN

  SET @t1 := concat('UPDATE TEST5 SET `', clm,'` = not `', clm, '` where id= ? ');   
  SET @id := id;
  PREPARE stmt FROM @t1;
  EXECUTE stmt USING @id;
  DEALLOCATE PREPARE stmt;

END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...