SQL一致性不';不接收参数
我试图在创建表时设置IDENTITY seed参数,从变量中获取它SQL一致性不';不接收参数,sql,identity,Sql,Identity,我试图在创建表时设置IDENTITY seed参数,从变量中获取它 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)
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主键非空标识(@MaxID,1))
但我不确定这是否与语法有关。有人能解释一下我哪里错了吗?:)类似于
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语句,然后执行它
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语句,然后执行它。这不能参数化
您需要使用动态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
不会受到任何插入的影响。这无法参数化
您需要使用动态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
不会受到任何插入的影响。您需要为此使用动态SQL。这样做的原因是什么?您使用的是什么版本的SQL Server?此表用作复杂导入过程的临时表,因此需要具有正确的标识种子将与主表进行内部联接以完成导入。您能否进一步解释一下动态sql?使用sql Server 2012,您可以使用一个序列来确保两个表@gbn之间的连续数字-它确保顺序不连续(就像标识)@MartinSmith:是的,但它允许预先分配ID,所以ProductQuotes上没有冲突(正如您的回答所指出的)避免使用动态SQL您需要为此使用动态SQL。这样做的原因是什么?您使用的是什么版本的SQL Server?此表用作复杂导入过程的临时表,因此它需要具有正确的标识种子才能与主表内部联接以完成导入。您能否进一步解释一下动态SQLl?使用SQL Server 2012,您可以使用一个序列来确保两个表之间的连续数字@gbn-它确保顺序不连续(就像IDENTITY
)@MartinSmith:true,但它允许预先分配ID,因此ProductQuotes上没有冲突(如您的答案所述),并避免动态SQL