SQL插入过程

时间:2009-08-05 04:44:44

标签: sql-server tsql

为什么我的插入过程不返回新插入的行的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

5 个答案:

答案 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()可能不会在用户函数/过程的上下文中返回值。