【问题标题】:Incorrect syntax when working with a variable in IDENTITY使用 IDENTITY 中的变量时语法不正确
【发布时间】:2021-09-11 02:59:03
【问题描述】:

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

我的代码是:

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

但我收到此错误:

消息 102,第 15 级,状态 1,第 24 行
'@Table1_NextKey' 附近的语法不正确

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

【问题讨论】:

  • 您不能在 DDL 语句中使用变量。如果你想这样做,你需要动态 SQL。

标签: sql sql-server tsql variables ddl


【解决方案1】:

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

【讨论】:

  • 谢谢。一个小改动:变量需要转换为 varchar。我将在下面发布我要工作的内容。
  • 抱歉,您使用的是 concat 命令。你是对的,你的代码有效。
  • 不用担心是的 concat 总是返回一个字符串。
【解决方案2】:

不知道为什么 SQL Server 对此如此奇怪,但在 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'

【讨论】:

  • 这有什么奇怪的?
  • GO 不是 SQL 语句,它是 SSMS 的批处理分隔符,不适用于 sp_executesql
【解决方案3】:

你做错了。

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

在这种情况下,不要在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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 2011-09-02
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多