Sql server sql server:创建序列的过程
我想创建一个存储过程来检查序列是否具有给定的名称是否存在,或者是否存在,以创建它或将其值更改为从给定表名中选择的max(Id),因此我创建了下面的过程,但它抛出了一个语法错误Sql server sql server:创建序列的过程,sql-server,stored-procedures,sequence,Sql Server,Stored Procedures,Sequence,我想创建一个存储过程来检查序列是否具有给定的名称是否存在,或者是否存在,以创建它或将其值更改为从给定表名中选择的max(Id),因此我创建了下面的过程,但它抛出了一个语法错误 CREATE PROCEDURE EBPP_CORE.CREATE_OR_ALTER_SEQUENCE @sequence_name VARCHAR2, @table_name VARCHAR2 AS BEGIN DECLARE @MAX_ID_VAL NUMBER; DECLARE @se
CREATE PROCEDURE EBPP_CORE.CREATE_OR_ALTER_SEQUENCE
@sequence_name VARCHAR2,
@table_name VARCHAR2
AS
BEGIN
DECLARE @MAX_ID_VAL NUMBER;
DECLARE @sequence_exist NUMBER;
SELECT @MAX_ID_VAL = CAST(ISNULL(MAX(id) + 1, 1) as nvarchar(10)) FROM @table_name ;
SELECT @sequence_exist = COUNT(*) FROM sys.sequences WHERE name = @sequence_name;
IF @sequence_exist>0
' ALTER SEQUENCE @sequence_name RESTART WITH @MAX_ID_VAL';
ELSE
'CREATE SEQUENCE @sequence_name START WITH @MAX_ID_VAL INCREMENT BY 1' ;
END
您必须使用动态SQL来查找当前的max ID,并创建或更改序列对象。大概是这样的:
CREATE OR ALTER PROCEDURE EBPP_CORE.CREATE_OR_ALTER_SEQUENCE
@sequence_name nvarchar(128),
@table_name nvarchar(128)
AS
/*
drop table if exists foo
go
create table foo(id int)
exec EBPP_CORE.CREATE_OR_ALTER_SEQUENCE 'foo_seq','foo'
insert into foo(id) values (3)
exec EBPP_CORE.CREATE_OR_ALTER_SEQUENCE 'foo_seq','foo'
*/
BEGIN
DECLARE @MAX_ID_VAL bigint;
DECLARE @sequence_exist bigint;
declare @sql nvarchar(max) = concat('select @MAX_ID_VAL = MAX(id) + 1 FROM ', quotename(@table_name));
print @sql;
exec sp_executesql @sql, N'@MAX_ID_VAL bigint output', @MAX_ID_VAL=@MAX_ID_VAL output;
set @MAX_ID_VAL = coalesce(@MAX_ID_VAL,1)
SELECT @sequence_exist = COUNT(*) FROM sys.sequences WHERE name = @sequence_name;
IF @sequence_exist>0
BEGIN
set @sql = concat('ALTER SEQUENCE ', quotename(@sequence_name), ' RESTART WITH ', @MAX_ID_VAL) ;
print @sql;
exec (@sql);
END
ELSE
BEGIN
set @sql = concat('CREATE SEQUENCE ', quotename(@sequence_name), ' START WITH ', @MAX_ID_VAL,' INCREMENT BY 1') ;
print @sql;
exec (@sql);
END
END
请添加语法错误的详细信息以及有关输入和输出的示例。您必须为此使用动态sql。但是我不得不问,为什么你首先需要一个程序来创建一个序列?这听起来像是设计中有点偏离了中心。为什么需要用当前值重新启动序列?此外,您的语法看起来更像sql server,但有些数据类型不是sql server(varchar2,number)。不知道if语句的主体在做什么,它只是一个部分语句。单引号中引用的变量将是文本。一种方法是使用动态SQL并正确创建字符串以执行它。