Insert的存储过程将不会执行并抛出2个错误

时间:2013-09-01 15:42:21

标签: sql sql-server stored-procedures

我编写了一个存储过程,它看起来设置正确,这是存储过程:

CREATE PROCEDURE sp_Insert$Order$For$Travel
(
@CardHolderName varchar(50),--Userprofile
@CardNumber int, --Userprofile
@SecurityCode int, --Userprofile
@ExpiryDate date, --Userprofile
@DeparturePoint int, --Order
@DestinationPoint int, --Order
@DepartureTime datetime, --Order
@DestinationTime datetime, --Order
@Passengers int, --Order
@RoundTrip char(3), --Order
@ReturnDate datetime, --Order
@OrderNumber int --order
)
AS
Declare @UserIdentity int

Insert into [UserProfile]
(CardHolderName, CardHolderName, SecurityCode, ExpiryDate)
values
(@CardHolderName, @CardNumber, @SecurityCode, @ExpiryDate)
set @UserIdentity = @@IDENTITY

Insert into [Order]
(DeparturePoint, DestinationPoint, DepartureTime, DestinationPoint,DestinationTime,Passengers,RoundTrip, ReturnDate, OrderNumber, UserID)
values
(@DeparturePoint, @DestinationPoint, @DepartureTime, @DestinationPoint, @DestinationTime,@Passengers, @RoundTrip, @ReturnDate, @OrderNumber, @UserIdentity)

当我去执行它时,我收到了这两个错误。

  

Msg 264,Level 16,State 1,Procedure sp_Insert $ Order $ For $ Travel,Line 25
  在INSERT的SET子句或列列表中多次指定列名“CardHolderName”。在同一子句中不能为列分配多个值。修改子句以确保列只更新一次。如果此语句将列更新或插入到视图中,则列别名可以隐藏代码中的重复。

     

Msg 264,Level 16,State 1,Procedure sp_Insert $ Order $ For $ Travel,Line 31
  在INSERT的SET子句或列列表中多次指定列名“DestinationPoint”。在同一子句中不能为列分配多个值。修改子句以确保列只更新一次。如果此语句将列更新或插入到视图中,则列别名可以隐藏代码中的重复。

我查看了我的存储过程并查看过去曾做过的其他人,看起来没问题,我只是看不出问题出在哪里。

任何人都知道我的问题是什么?我已经检查了我的参数,并且它们都是正确的,基于我想要将它们插入表中的列...

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

确切地说错误是什么:

 Insert into [UserProfile]
 (CardHolderName, CardHolderName, SecurityCode, ExpiryDate)
 values
 (@CardHolderName, @CardNumber, @SecurityCode, @ExpiryDate)

...目标列中的CardHolderName 两次。据推测,第二个应该是CardNumber

另一个是相似的。

答案 1 :(得分:1)

请改为尝试:

Insert into [UserProfile](CardHolderName, CardNumber, SecurityCode, ExpiryDate)
    values (@CardHolderName, @CardNumber, @SecurityCode, @ExpiryDate);

set @UserIdentity = SCOPE_IDENTITY();

我认为您希望CardNumber代替第二个变量,而不是CardHolderName

我还将@@IDENTITY更改为SCOPE_IDENTITY(),这更安全。

编辑:

我认为文档很好地解释了它here

基本思路是获取最新身份的四种方式(@@IDENTITYSCOPE_IDENTIY()IDENT_CURRENT()OUTPUT子句。最安全的是OUTPUT子句。其他三个依赖于三个方面:“表”,“连接”和“范围”。

前两个返回最近的身份,无论表是,但是在同一个连接上。如果表上有插入触发器,则触发器可能会将值插入另一个表中。 @@IDENTITY将从该表返回id(相同的连接,不同的范围)。 SCOPE_IDENTITY()将从预期的表中返回id(相同的连接,相同的范围)。 IDENT_CURRENT()只是邀请其他连接的竞争条件,也可能是在表上添加行。

OUTPUT条款不受这些解释的影响。它只是将insert中的值放入临时表中 - 代价是更多编码和学习新东西。

答案 2 :(得分:0)

您在以下行中有错误:

Insert into [UserProfile]
(CardHolderName, CardHolderName, SecurityCode, ExpiryDate)

在insert语句中对表“UserProfile”重复列名“CardHolderName”两次

Insert into [Order]
(DeparturePoint, DestinationPoint, DepartureTime, DestinationPoint)

在insert语句中重复列名“DestinationPoint”两次到表“Order”。