插入存储过程的返回值

时间:2019-06-17 03:09:06

标签: sql sql-server tsql

我正在尝试为存储过程INSERT设置一个RETURN的值,但是我无法使其正常工作。

我有一个名为"person.person_ids"的表,其中有字段"id int, uid uniqueidentifier"

以及其他一些表,例如"person.employee""person.client"等。这些表都从"id"表中获取"person.person_ids"作为外键。

该过程将执行以下操作:

CREATE PROCEDURE PERSON.NewPerson
AS 
BEGIN 
    DECLARE @ret INT;
    INSERT INTO PERSON.ID_PERSON
    VALUES (NEWID());
    SET @ret = SCOPE_IDENTITY()
    RETURN @ret;
END
GO

我的INSERT看起来像这样:

    INSERT INTO PERSON.EMPLOYEE VALUES
    (EXECUTE PERSON.NewPerson, 1, '15434235', '10768348153', '1962-3-2', '1999-10-2', 'PETER', '', 'SMITH', 'HAMMER')
GO

基本上,我试图创建一个函数存储过程,每当我向"person.person_ids"中插入新记录时,就可以调用该函数以自动在"person.employee"中生成新记录。

我尝试使用OUTPUT中的INSERT,但无法正常使用,并且在函数内部不允许插入。

1 个答案:

答案 0 :(得分:2)

这是您的代码,已修复问题并建议进行一些改进。这些评论解释了什么以及为什么。

SP:

CREATE PROCEDURE PERSON.NewPerson
(
  -- Use an output parameter to get values out of an SP
  @NewId int out
)
AS 
BEGIN 
  -- Recommended to always list the columns you are inserting to
  -- Personally my preference is to select them (because that scales to multiple inserts), I never use the 'values' clause.
  INSERT INTO PERSON.ID_PERSON (uid)
    select newid();

  SET @NewId = SCOPE_IDENTITY()

  -- The return statement is for a status for the SP, usually 0 for success, some other int for an error
  RETURN 0;
END
GO

呼叫SP:

declare @MyNewId int;

-- Run the SP before your insert to get your new value    
exec PERSON.NewPerson @MyNewId out;

-- Then insert - ideally with a list of columns
INSERT INTO PERSON.EMPLOYEE
  select @MyNewId, 1, '15434235', '10768348153', '1962-3-2', '1999-10-2', 'PETER', '', 'SMITH', 'HAMMER'