我编写了一个存储过程,它看起来设置正确,这是存储过程:
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”。在同一子句中不能为列分配多个值。修改子句以确保列只更新一次。如果此语句将列更新或插入到视图中,则列别名可以隐藏代码中的重复。
我查看了我的存储过程并查看过去曾做过的其他人,看起来没问题,我只是看不出问题出在哪里。
任何人都知道我的问题是什么?我已经检查了我的参数,并且它们都是正确的,基于我想要将它们插入表中的列...
有什么想法吗?
答案 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。
基本思路是获取最新身份的四种方式(@@IDENTITY
,SCOPE_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”。