我是这个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服务器?
答案 0 :(得分:0)
此代码对Sql Server来说也很糟糕,因为它未能将增量/选择封装在事务中。要为Sql Server修复它,应将其更改为使用Identity列或(甚至更好)使用sequence和NEXT VALUE FOR。
很酷的一点是,该序列在MySql / MariaDB中也有效。因此,要翻译此代码,请先创建序列:
CREATE SEQUENCE VacancySeq START WITH CurrentMaxValueHere INCREMENT BY 1;
然后更新该函数以从序列中提取:
return next value for VacancySeq
我知道这将丢失V
和前导零...但是将它们存储为列值的一部分是错误的。这是一个 formatting 问题,格式化应尽可能在客户端而不是在数据库中进行。