Sql server 为什么不接受整数变量作为顺序中的START WITH的值

Sql server 为什么不接受整数变量作为顺序中的START WITH的值,sql-server,tsql,database-sequence,Sql Server,Tsql,Database Sequence,我试图为序列创建动态起始编号,但它不接受变量viz@START\u SEQ对于从开始。请考虑以下代码:- CREATE PROCEDURE [dbo].[SP_RESET_SEQ] AS DECLARE @START_SEQ INT =0; BEGIN SET @START_SEQ = (SELECT MAX(USER_ID)+1 FROM MASTER_USER); IF OBJECT_ID('SEQ_USER_ID') IS NOT NULL DROP SEQUENCE [dbo].[S

我试图为序列创建动态起始编号,但它不接受变量viz<代码>@START\u SEQ对于
从开始
。请考虑以下代码:-

CREATE PROCEDURE  [dbo].[SP_RESET_SEQ]
AS
DECLARE @START_SEQ INT =0;

BEGIN
SET @START_SEQ = (SELECT MAX(USER_ID)+1 FROM MASTER_USER);
IF OBJECT_ID('SEQ_USER_ID') IS NOT NULL
DROP SEQUENCE [dbo].[SEQ_USER_ID]

CREATE SEQUENCE [dbo].[SEQ_USER_ID] 
 AS [bigint]
 START WITH @START_SEQ
 INCREMENT BY 1
 MINVALUE 1
 MAXVALUE 99999999
 CACHE 
END

您可以对动态SQL执行相同的操作:

CREATE PROCEDURE  [dbo].[SP_RESET_SEQ]
AS
DECLARE @START_SEQ INT =0;

BEGIN
SET @START_SEQ = (SELECT MAX(USER_ID)+1 FROM MASTER_USER);
IF OBJECT_ID('SEQ_USER_ID') IS NOT NULL
DROP SEQUENCE [dbo].[SEQ_USER_ID]

DECLARE @sql NVARCHAR(MAX)

SET @sql = 'CREATE SEQUENCE [dbo].[SEQ_USER_ID] 
 AS [bigint]
 START WITH ' + @START_SEQ
 + 'INCREMENT BY 1
 MINVALUE 1
 MAXVALUE 99999999
 CACHE'

 EXEC(@sql) 
END

如下文所述(谢谢!),
CREATE SEQUENCE
的语法采用一个常量(请参阅)。

另一个示例与上面的示例不适用于我

declare @maxBookingId as int 
select @maxBookingId = max(bookingid) from booking
declare @s nvarchar(4000);
set @s = N'
CREATE SEQUENCE Invoice_Seq  AS INTEGER  
START WITH ' + cast(@maxBookingId as nvarchar) + '
INCREMENT BY 1  
NO CYCLE;'

EXEC (@s);

看起来您的内部查询中缺少
FROM
关键字。我在问题中做了更正@Raj如果在读取
MAX(user\u ID)
值和创建序列之间将新用户添加到
MASTER\u用户
,会发生什么情况?旁注:存储过程不应使用
sp\u
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀!我相信这是唯一的方法:。除了变量@sql外,其他都可以正常工作。我必须将@START_-SQL转换为nvarchar
SET@SQL='创建序列[dbo]。[SEQ_-USER_-ID]作为[bigint]以“+convert”(nvarchar(10),@START_-SEQ)+”开始,增量为1 MINVALUE 1 MAXVALUE 9999999缓存
@maxBookingId+1
?没有序列本身进行增量操作:)哦,对了,通常,使用序列的代码将使用下一个值。因此,如果序列以当前的最大id开始就可以了。