为什么我的插入过程不返回新插入的行的ID?并且,在调用此过程时,为什么我必须为@EventId提供值?该列是带有IDENTITY的PK。
IF OBJECT_ID ( 'vjsql.EventsINSERT', 'P') IS NOT NULL
DROP PROCEDURE EventsINSERT
GO
CREATE PROCEDURE EventsINSERT
@EventId int OUTPUT,
@EventDate datetime,
@Title varchar(100),
@IsActive bit
AS
BEGIN
INSERT INTO EventCalendar ( EventDate, Title, IsActive)
VALUES ( @EventDate, @Title, @IsActive)
SELECT @EventId = SCOPE_IDENTITY()
END
答案 0 :(得分:3)
您是如何调用存储过程的?
此SP通过使用OUTPUT参数返回EventID的值 即在编程术语中,这是一个接受OUTPUT参数的过程(不是函数),该参数将在执行存储过程期间使用该值设置。
为此,您必须传递@EventID的变量。其值将在过程中设置,并且一旦过程完成,您将能够读取它的值。
请参阅下面的示例代码。
DECLARE @NewEventID INT
EXEC EventsINSERT
@EventId = @NewEventID OUTPUT,
@EventDate = '08/04/09',
@Title = 'Hello World',
@IsActive = 0
SELECT @NewEventID
答案 1 :(得分:1)
尝试添加一些语句终结符:
BEGIN
INSERT INTO EventCalendar ( EventDate, Title, IsActive)
VALUES ( @EventDate, @Title, @IsActive);
SELECT @EventId = SCOPE_IDENTITY();
END
AND,在调用此过程时,为什么必须为@EventId提供值?该列是带有IDENTITY的PK。
你没有,但你需要提供一个int类型的变量(或与int兼容)来输入值。
答案 2 :(得分:1)
您不需要为OUTPUT
参数指定值,您需要指定输出放入的局部变量:
默认情况下,SQL Management Studio将参数和变量命名为相同,这可能会造成混淆。以下是您的SP被调用的示例:
DECLARE @InsertedEventId int
EXEC [dbo].[EventsINSERT]
@EventId = @InsertedEventId OUTPUT,
@EventDate = N'2009-08-05',
@Title = N'Some event',
@IsActive = 1
-- Display ID as result set
SELECT @InsertedEventId
只是为了澄清:您的存储过程没问题。我按原样使用它。
答案 3 :(得分:0)
为什么不是我的插入程序 返回新插入的ID 行?
您的代码应该有效。尝试使用控制台而不是
SELECT @EventId = SCOPE_IDENTITY()
操作
SELECT SCOPE_IDENTITY()
并查看会发生什么。您可能以错误的方式调用它。您应该将OUTPUT变量的值存储在调用此SP的范围内的变量中。
调用此程序时,为什么我这样做 必须为@EventId提供一个值?
因为你必须为你拥有的每个参数提供一个值。如果是实数值并不重要,它将被丢弃,但您必须使用此参数中的变量调用存储过程来捕获返回的值。
答案 4 :(得分:-1)
我对tsql很生疏,但你不需要明确选择@@ identity来获取那个行ID吗?这就是我要挖掘的地方,因为我认为scope_identity()可能不会在用户函数/过程的上下文中返回值。