【问题标题】:SQL INDENTITY DOESN'T RECEIVE PARAMETERSSQL 标识不接收参数
【发布时间】:2013-06-20 18:54:47
【问题描述】:

我试图在创建表时设置 IDENTITY 种子参数,从 var 中获取它。像这样的

DECLARE @MaxID INTEGER
SET @MaxID = (SELECT TOP 1 ID FROM dbo.ProductQuotes ORDER BY ID DESC) + 1;

CREATE TABLE [dbo].[Z](
 [ID] int PRIMARY KEY not null IDENTITY(@MaxID,1),
 [Number] int NULL,
 [Name] nvarchar(50) COLLATE Cyrillic_General_CI_AS NULL
) ON [PRIMARY]

GO

错误是“'@MaxID' 附近的语法不正确(在这一行 [ID] int PRIMARY KEY not null IDENTITY(@MaxID,1) )

但我不确定它是否与语法有关。有人可以解释一下我在哪里错了吗? :)

【问题讨论】:

  • 您需要为此使用动态 SQL。这样做的原因是什么?还有你使用的是什么版本的 SQL Server?
  • 这个表是一个复杂导入过程的临时表,所以它需要有正确的标识种子才能与主表内联以完成导入。你能多解释一下动态sql吗?
  • 使用 SQL Server 2012,您可以使用 SEQUENCE 来确保两个表之间的连续数字msdn.microsoft.com/en-us/library/ff878091.aspx
  • @gbn - 确保顺序不连续(IDENTITY 也是如此)
  • @MartinSmith:是的,但它允许预先分配 ID,因此 ProductQuotes 上没有冲突(如您的回答所述)并避免动态 SQL

标签: sql identity


【解决方案1】:

这不能被参数化。

您需要使用如下动态 SQL。

DECLARE @MaxID INTEGER

SELECT @MaxID = 1 + ISNULL(MAX(ID),0) FROM dbo.ProductQuotes

DECLARE @Script NVARCHAR(MAX) = 
N'
CREATE TABLE [dbo].[Z](
 [ID] int PRIMARY KEY not null IDENTITY(' + CAST(@MaxID AS NVARCHAR(10)) + ',1),
 [Number] int NULL,
 [Name] nvarchar(50) COLLATE Cyrillic_General_CI_AS NULL
) ON [PRIMARY]
'

EXEC (@Script);

我假设您会采取预防措施确保ProductQuotes 在导入过程中不会受到任何插入。

【讨论】:

    【解决方案2】:

    类似

    DECLARE @MaxID INTEGER
    DECLARE @SQL varChar(4000)
    SET @MaxID = (SELECT TOP 1 ID FROM dbo.ProductQuotes ORDER BY ID DESC) + 1;
    
    Set @SQL = 'CREATE TABLE [dbo].[Z]([ID] int PRIMARY KEY not null IDENTITY(' +
    Convert(VarChar(8),@MaxID) + 
    ',1), [Number] int NULL, [Name] nvarchar(50) COLLATE Cyrillic_General_CI_AS NULL) ON [PRIMARY]
    Exec(@sql)
    

    使用@MaxID 的值构建sql 语句,然后执行它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-10
      • 2021-03-20
      • 2014-09-21
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多