【问题标题】:Sql Script Error in Stored Procedure for Insert Entry插入条目的存储过程中的 Sql 脚本错误
【发布时间】: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


【解决方案1】:

您的整个过程可以大大简化到此。

create procedure [dbo].[AddMultipleErrors]
    @errors ErrorTableType readonly
as

insert into [dbo].[Error] (ErrorMessage, FileId) 
select ErrorMessage, FileId from @errors

go

【讨论】:

  • 显然编写函数的人回忆起他们上次尝试直接复制时遇到错误,但您的更改现在似乎与我的工作正常,所以我将继续这样做。谢谢。
【解决方案2】:

好吧,这就是我们想出来的:

我收到有关 ID 的错误的原因不是因为插入过程,而是因为表类型。在 ErrorTableType 中,我将 Id 与其他列一起包括在内。从表类型中删除 Id(但将其保留在表本身中)似乎可以修复错误。

【讨论】:

    猜你喜欢
    • 2013-11-13
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多