在 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;
我正在尝试创建一个新的 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;