Sql server 为什么不接受整数变量作为顺序中的START WITH的值
我试图为序列创建动态起始编号,但它不接受变量viz<代码>@START\u SEQ对于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
从开始
。请考虑以下代码:-
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转换为nvarcharSET@SQL='创建序列[dbo]。[SEQ_-USER_-ID]作为[bigint]以“+convert”(nvarchar(10),@START_-SEQ)+”开始,增量为1 MINVALUE 1 MAXVALUE 9999999缓存
@maxBookingId+1
?没有序列本身进行增量操作:)哦,对了,通常,使用序列的代码将使用下一个值。因此,如果序列以当前的最大id开始就可以了。