Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 Insert won'的存储过程;t执行并抛出2个错误_Sql_Sql Server_Stored Procedures - Fatal编程技术网

Sql Insert won'的存储过程;t执行并抛出2个错误

Sql Insert won'的存储过程;t执行并抛出2个错误,sql,sql-server,stored-procedures,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 @Destinat

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

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,第16级,状态1,程序sp_插入$Travel的$Order$,第25行
在SET子句或INSERT的列列表中多次指定列名“CANDERNAME”。一个列不能在同一子句中分配多个值。修改该子句以确保列只更新一次。如果此语句更新或向视图中插入列,则列别名可能会隐藏代码中的重复

Msg 264,第16级,状态1,程序sp_插入$Travel的$Order$,第31行
在INSERT的SET子句或列列表中多次指定列名“DestinationPoint”。一个列不能在同一子句中分配多个值。修改该子句以确保列只更新一次。如果此语句更新或向视图中插入列,则列别名可能会隐藏代码中的重复

我已经查看了我的存储过程,并查看了我过去所做的其他存储过程,它看起来还可以,我只是不知道问题出在哪里

有人知道我有什么问题吗?我已经检查了我的参数,根据表中我想插入它们的列,它们都是正确的


有什么想法吗?

以下几行有错误:

Insert into [UserProfile]
(CardHolderName, CardHolderName, SecurityCode, ExpiryDate)
在表“UserProfile”的insert语句中重复列名称“CANDERNAME”两次


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

这正是错误所说的:

 Insert into [UserProfile]
 (CardHolderName, CardHolderName, SecurityCode, ExpiryDate)
 values
 (@CardHolderName, @CardNumber, @SecurityCode, @ExpiryDate)
。。。在目标列中有两次持卡人名称。第二个应该是
卡号

另一个类似。

请尝试以下方法:

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

set @UserIdentity = SCOPE_IDENTITY();
我想您希望第二个变量是
cardname
,而不是
cardname

我还将
@@IDENTITY
更改为
SCOPE\u IDENTITY()
,这样更安全

编辑:

我认为文档很好地解释了这一点

基本思想是获取最新标识的四种方法(
@@identity
SCOPE_IDENTIY()
IDENT_CURRENT()
,以及
输出
子句)。最安全的是
输出
子句。其他三个依赖于三件事:“表”、“连接”和“范围”

前两个返回最近的标识,与表无关,但在同一个连接上。如果表上有insert触发器,则触发器可能会将值插入另一个表中
@@IDENTITY
将从该表返回
id
(相同的连接,不同的作用域)
SCOPE\u IDENTITY()
将从目标表(相同连接,相同范围)返回
id
IDENT_CURRENT()
只是邀请一个与其他连接的竞争条件,这些连接可能也会将行添加到表中


OUTPUT
子句不受这些解释的影响。它只是将
insert
中的值放入一个临时表中,而代价是编写更多的代码并学习一些新的内容。

哦,天哪,我甚至没有注意到that@fabulaspb,注意到它并向我指出了它。旁注:您不应该在存储过程中使用
sp
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀@谢谢你的提示。一直以来,我都在使用sp_u的前缀,从来没有想过这一点。在我以后的所有存储过程中,我都会记住这一点。谢谢,你能解释一下@Identity和Scope\u Identity之间的区别吗?我一直使用@Identity,这个Scope\u Identity对我来说是新的解释和链接。现在我对差异有了更好的理解是的,这是我的一个错误,我没有意识到我在sp中复制了列。我现在删除了两个重复项及其工作。谢谢你的回答:)
Insert into [UserProfile](CardHolderName, CardNumber, SecurityCode, ExpiryDate)
    values (@CardHolderName, @CardNumber, @SecurityCode, @ExpiryDate);

set @UserIdentity = SCOPE_IDENTITY();