在 IDENTITY 中使用变量时语法不正确

Incorrect syntax when working with a variable in IDENTITY

我正在尝试创建一个新的 table,其主键值是先前 table 的延续。

我的代码是:

DECLARE @Table1_NextKey INT

SELECT @Table1_NextKey = MAX(id) + 1 
FROM [Copy of Table1]

CREATE TABLE [dbo].Table1
(
    [ID] [int] NOT NULL IDENTITY(@Table1_NextKey, 1) 
        CONSTRAINT PK_Table1 PRIMARY KEY CLUSTERED,
    [PLAN] [nvarchar](255) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

但是我得到这个错误:

Msg 102, Level 15, State 1, Line 24
Incorrect syntax near '@Table1_NextKey'

有没有办法让 Create Table 与变量一起工作?

您只能为 identity 使用文字值,您需要动态构建 create 语句,如下所示

declare @sql nvarchar(max)=Concat(N'
CREATE TABLE [dbo].Table1(
  [ID] [int] NOT NULL IDENTITY(', @Table1_NextKey, N', 1) CONSTRAINT PK_Table1 PRIMARY KEY CLUSTERED,
  [PLAN] [nvarchar](255) NULL) 
ON [PRIMARY]')

exec sp_executesql @sql

不知道为什么 SQL 服务器对此很奇怪,但在 Stu 的帮助下,我让它工作了:

DECLARE @Table1_NextKey INT,
@SQL_command varchar(4000)
select @Table1_NextKey=max(id)+1 from [Copy of Table1]

set @SQL_command=
'CREATE TABLE [dbo].Table1(
    [ID] [int] NOT NULL IDENTITY(' + convert(varchar(5), @Table1_Nextkey) + ', 1) CONSTRAINT PK_Table1 PRIMARY KEY CLUSTERED,
    [PLAN] [nvarchar](255) NULL) 
ON [PRIMARY] 
GO'

你做错了。

你显然想做的是复制一个 table 然后你想继续标识值。

在这种情况下,不要在CREATE TABLE声明不同的种子值,之后手动设置即可:

CREATE TABLE [dbo].Table1
(
    [ID] [int] NOT NULL IDENTITY(1, 1) 
        CONSTRAINT PK_Table1 PRIMARY KEY CLUSTERED,
    [PLAN] [nvarchar](255) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

-- Do some copying code here

DECLARE @Table1_NextKey INT =
(
    SELECT @Table1_NextKey = MAX(id)  -- not + 1 
    FROM Table1
);

DBCC CHECKIDENT (Table1 RESEED, @Table1_NextKey) WITH NO_INFOMSGS;