【发布时间】:2014-12-10 19:42:39
【问题描述】:
我正在开发一个存储过程以将条目批量添加到表中。
这是我到目前为止所得到的:
use [DebugDatabase]
go
set ansi_nulls on
go
set quoted_identifier on
go
create procedure [dbo].[AddMultipleErrors]
@errors ErrorTableType readonly
as
declare @toInsert ErrorTableType
begin
insert into @toInsert select * from @errors
insert into [dbo].[Error] (ErrorMessage, FileId) select ErrorMessage, FileId from @toInsert
end
go
我收到消息“只有在使用列列表并且 IDENTITY_INSERT 为 ON 时,才能为表 '@toInsert' 中的标识列指定显式值。”
我尝试在“declare”语句后添加“set identity_insert @toInsert on”行,但出现“语法错误”错误。我已经尝试将它移动到其他几个位置,结果相同。
现在,我做了一些研究,看起来我实际上并不想将“identity_insert”设置为 on,因为它会要求我指定一个 id 而不是让表自动生成一个,这正是我想要的。
据推测,我需要做的就是在插入调用中指定表中的每个单独的列,省略 id 值,并且一切都应该匹配得很好。但是,除非我弄错了,否则程序已经这样设置了,但它仍然不喜欢它。
有什么我可能会遗漏的吗?
【问题讨论】:
-
您不能对表变量使用 SET IDENTITY_INSERT。为什么首先需要@toInsert?
-
@GiorgosBetsos:这是一个很好的问题,如果我对 sql 有更好的理解,我可能会回答这个问题。事实上,这个程序是基于我老板发给我的一个例子。
-
从一个表中取出行并将它们插入到另一个表中是没有意义的。只需从参数中插入即可。无需创建它的副本。
-
@SeanLange:你说得对,这似乎没有任何意义。
标签: sql-server stored-procedures bulkinsert identity-insert