Пока он контролируется белым списком и не используется для заполнения контекста значения (который лучше обрабатывается по-другому), он « хорошо »использовать динамически сгенерированный SQL , потому что результирующий оператор SQL контролируется.
Однако, Dynami c SQL - большой молот это добавляет ненужную сложность.
В случае действия «-» просто умножьте значение на -1 (читай: измените знак), прежде чем использовать его в качестве заполнителя или контекст переменной , а затем всегда используйте + в качестве действия: «количество + х» или «количество + (-х)» являются допустимыми. Этот особый случай не будет применяться к другим операторам, таким как «*».
SET @adjustment = CASE WHEN @action = '-' THEN -@number ELSE @number END
UPDATE instock SET quantity = quantity + @adjustment
WHERE productid = @foundID
Даже если разрешить другие операторы, это все равно можно сделать с помощью «CASE @action WHEN ..» и устранить динамику. Генерация c SQL, поскольку сама MySQL будет выполнять различную обработку в зависимости от действия, а само действие указывается только в том случае, если допустимо значение .
UPDATE instock
SET quantity = (CASE @action
WHEN '*' THEN quantity * @number
WHEN '-' THEN quantity - @number
WHEN 'e' THEN 2.71828
ELSE quantity + @number
END)
WHERE productid = @foundID
Динамическое построение SQL строк обычно требуется только тогда, когда форма запроса изменяется, и во многих случаях подход к запросу способом, определяющим проблему, c часто приводит к более чистым решениям.