Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL一致性不';不接收参数_Sql_Identity - Fatal编程技术网

SQL一致性不';不接收参数

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)

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