Я новичок в этих функциях sql. Мне нужно настраиваемое поле с автоматическим увеличением со следующей функцией SQL.
CREATE FUNCTION nextvacancy() returns char(5) as begin
declare @lastval char(5)
declare @i int
declare @newId char(5)
set @lastval = (select max(vacancyId) from vacancy)
if @lastval IS NULL
set @lastval = 'V0000'
set @i = right(@lastval,4) + 1
set @newId = 'V' + right('000' + convert(varchar(10),@i),4)
return @newId end
Это нормально работало с mssql, но на сервере mariaDb показывает эту ошибку.
# 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис рядом с 'declare @lastval char (5) объявить @i int объявить @newId char (5)
Результат должен быть таким. V0001, V0002
Как я могу адаптировать этот код к серверу mDb?
да. Это mssql
Это нет хороший запрос SQL Server. MAX+1
просто напрашивается на ошибки целостности из-за повторяющихся значений. SQL Server имеет объекты SEQUENCE для этого задания, как и MariaDB. В обеих базах данных вы можете записать SELECT NEXT VALUE FOR VacanciesSequence AS VacancyID
, чтобы получить следующее значение. Форматирование различается для каждой базы данных. В SQL Server вы должны написать select format(someID,'\V0000')
для форматирования значения с префиксом V
и 4 цифрами. select format(next value for vacancies,'\V0000') as NextVacancy
В MariaDB вам, вероятно, придется явно добавить префикс V
и использовать LPAD
для ведущих нулей: select 'V' + LPAD(next value for vacancies,4) as NextVacancy
.
На самом деле я думаю, что ваша настоящая проблема состоит в том, чтобы запутать рендеринг с постоянными значениями. Вы должны использовать обычное автоматическое приращение, но оказывать его с ведущей буквой «V», желательно на уровне приложения (т.е. не в каком-либо SQL), поскольку ведущая буква «V» не имеет ничего общего с данными или где / как они сохраняются.
DELIMITER
; полуколоны; THEN
; и т. д. и т. д. Изучите синтаксис в руководстве. Изучите примеры на этом форуме.
Этот код также был очень плохой для Sql Server, потому что он не смог инкапсулировать приращение / выбор в транзакции. Чтобы исправить это для Sql Server, его следует изменить на использование столбца идентификаторов или (что еще лучше) последовательность и СЛЕДУЮЩЕЕ ЗНАЧЕНИЕ ДЛЯ.
И что самое интересное, последовательность работает и в MySql / MariaDB. Итак, чтобы перевести этот код, сначала создайте последовательность:
CREATE SEQUENCE VacancySeq START WITH CurrentMaxValueHere INCREMENT BY 1;
Затем обновите функцию, чтобы извлечь из последовательности:
return next value for VacancySeq
Я знаю, что здесь будет отсутствовать V
и ведущие нули ... но было бы ошибкой хранить их как часть значения столбца. Это проблема форматирование, и форматирование должно выполняться в максимально возможной степени на клиенте, а не в БД.
Этот код SQL будет нет работать в MySQL .. Предложение
CREATE FUNCTION
содержит ли нет ключевое словоAS
в MySQL ... Это похоже на SQL Server (MSSQL) синтаксис, у которого есть ключевое словоAS
... Итак, я изменил теги, потому что он выглядит так вы конвертируете синтаксис SQL-сервера (MSSQL) в синтаксис MariaDB (MySQL)