Sql server SQL插入过程

Sql server SQL插入过程,sql-server,tsql,Sql Server,Tsql,为什么插入过程不返回新插入行的ID?调用此过程时,为什么必须为@EventId提供一个值?该列是具有标识的PK IF OBJECT_ID ( 'vjsql.EventsINSERT', 'P') IS NOT NULL DROP PROCEDURE EventsINSERT GO CREATE PROCEDURE EventsINSERT @EventId int OUTPUT, @EventDate datetime,

为什么插入过程不返回新插入行的ID?调用此过程时,为什么必须为@EventId提供一个值?该列是具有标识的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

我对tsql很生疏,但是您不需要显式地选择@identity来获取行id吗?这就是我要深入挖掘的地方,因为我认为scope_identity()可能不会在用户函数/过程的上下文中返回值

我对tsql很生疏,但您不需要显式选择@identity来获取行id吗?这就是我要深入挖掘的地方,因为我认为scope_identity()可能不会在用户函数/过程的上下文中返回值

尝试添加一些语句终止符:

BEGIN
INSERT INTO EventCalendar ( EventDate, Title, IsActive)
VALUES ( @EventDate, @Title, @IsActive);

SELECT @EventId = SCOPE_IDENTITY();
END
调用此过程时,为什么必须为@EventId提供一个值?该列是具有标识的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

不需要,但确实需要为要输入的输出值提供int类型的变量(或与int兼容的变量)。

尝试添加一些语句终止符:

BEGIN
INSERT INTO EventCalendar ( EventDate, Title, IsActive)
VALUES ( @EventDate, @Title, @IsActive);

SELECT @EventId = SCOPE_IDENTITY();
END
调用此过程时,为什么必须为@EventId提供一个值?该列是具有标识的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

不需要,但确实需要提供int类型的变量(或与int兼容的变量),以便将输出值输入。

如何调用存储过程

此SP通过使用输出参数返回EventID的值。
i、 e.在编程术语中,这是一个过程(不是函数),它接受一个输出参数,该参数将在存储过程执行期间用值进行设置

为此,您必须为@EventID传递变量。其值将在程序内设置,一旦程序完成,您将能够读取其值

请参见下面的示例代码

DECLARE @NewEventID INT

EXEC EventsINSERT
  @EventId = @NewEventID OUTPUT,
  @EventDate = '08/04/09',
  @Title     = 'Hello World',
  @IsActive  = 0

SELECT @NewEventID 

如何调用存储过程

此SP通过使用输出参数返回EventID的值。
i、 e.在编程术语中,这是一个过程(不是函数),它接受一个输出参数,该参数将在存储过程执行期间用值进行设置

为此,您必须为@EventID传递变量。其值将在程序内设置,一旦程序完成,您将能够读取其值

请参见下面的示例代码

DECLARE @NewEventID INT

EXEC EventsINSERT
  @EventId = @NewEventID OUTPUT,
  @EventDate = '08/04/09',
  @Title     = 'Hello World',
  @IsActive  = 0

SELECT @NewEventID 

您不需要为
输出
参数指定值,您需要指定将输出放入哪个局部变量:

默认情况下,SQLManagementStudio将参数和变量命名为相同的名称,这可能会造成混淆。以下是您的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

只是澄清一下:您的存储过程很好。我按原样使用它。

您不需要为
输出
参数指定值,您需要指定将输出放入哪个局部变量:

默认情况下,SQLManagementStudio将参数和变量命名为相同的名称,这可能会造成混淆。以下是您的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
只是澄清一下:您的存储过程很好。我照原样用了

为什么我的插入程序不正确 返回新插入文件的ID 吵架

你的代码应该可以工作。在控制台中尝试,而不是

SELECT @EventId = SCOPE_IDENTITY()

看看会发生什么。有可能是你打错了电话。您应该将输出变量的值存储在调用此SP的范围内的变量中

调用此过程时,我为什么要 必须为@EventId提供一个值吗

因为必须为每个参数提供一个值。不管它是否是实值,它都将被丢弃,但必须使用此参数中的变量调用存储过程以捕获返回值

为什么我的插入程序不正确 返回新插入文件的ID 吵架

你的代码应该可以工作。在控制台中尝试,而不是

SELECT @EventId = SCOPE_IDENTITY()

看看会发生什么。有可能是你打错了电话。您应该将输出变量的值存储在调用此SP的范围内的变量中

调用此过程时,我为什么要 必须为@EventId提供一个值吗


因为必须为每个参数提供一个值。不管是不是真值,它都将被丢弃,但您必须使用此参数中的变量调用存储过程以捕获返回值。

请包含所有客户端代码,以便我们可以建议您如何更正。感谢所有回复!最后,我将Select@EventId=SCOPE_IDENTITY()更改为Select SCOPE_IDENTITY(),现在它可以工作了——只要我在执行过程时为ID值提供一个0。我不能投票支持eKek0的响应,但这是我尝试过的建议,效果很好。谢谢EK0请包括您的所有客户代码,以便我们可以建议您如何更正。感谢所有回复!最后,我将Select@EventId=SCOPE_IDENTITY()更改为Select SCOPE_IDENTITY(),现在它可以工作了——只要我在执行过程时为ID值提供一个0。我不能投票支持eKek0的响应,但这是我尝试过的建议,效果很好。谢谢eKek0actaully相反的方法-@@IDENTITY返回最后一个插入的标识值,但不限于当前范围-scope\U IDENTITY()是正确的方法,完全相反-@@IDENTITY返回最后一个插入的标识值,但不限于当前范围-scope\U IDENTITY()添加语句终止符(;)不会产生任何差异添加语句终止符(;)不会产生任何差异您可以为参数设置默认值,这样在调用过程时就不必包含它。但是我必须检查,如果带有默认值的参数后面跟有需要传递的参数,那么您可能必须使用命名参数来跳过使用默认值的参数。您可以设置def