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