SQL IDENTITY不接收参数

时间:2013-06-20 10:44:15

标签: sql identity

我正在尝试在创建表时设置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))

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

2 个答案:

答案 0 :(得分: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在导入过程中不会受到任何插入。

答案 1 :(得分:0)

这样的东西
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语句,然后执行它。