Sql server sql server:创建序列的过程

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

我想创建一个存储过程来检查序列是否具有给定的名称是否存在,或者是否存在,以创建它或将其值更改为从给定表名中选择的max(Id),因此我创建了下面的过程,但它抛出了一个语法错误

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并正确创建字符串以执行它。