【问题标题】:Output last inserted primary key value from stored procedure从存储过程中输出最后插入的主键值
【发布时间】:2013-05-10 12:09:43
【问题描述】:

我对这个有点困难,因为我不确定如何在 SQL Server 中执行此操作。

基本上,我想在数据库中插入一个新行,获取刚刚插入的 PK 值(相同的查询)并将其输出回所谓的存储过程:

CREATE PROCEDURE Users_Insert
    -- Add the parameters for the stored procedure here
    @userid int output,
    @name varchar(50),
    @surname varchar(50),
    @email varchar(200),
    @password varchar(50),
    @location varchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    insert into Users(FirstName, LastName, Email, Password, Location)
    values(@name, @surname, @email, @password, @location);
    GO
    @userid = @@IDENTITY;
END

我在 MySQL 中做了如下操作:

CREATE PROCEDURE Users_Insert(@userid int output, @name varchar(50), @surname varchar(50), @email varchar(200), @password varchar(50), @location varchar(50)
BEGIN

    insert into Users(FirstName, LastName, Email, Password, Location)
    values(@name, @surname, @email, @password, @location);

    set @userid = last_insert_id();
END

SQL Server 给我一个错误:

消息 102,级别 15,状态 1,过程 Users_Insert,第 18 行
'@userid' 附近的语法不正确。

坦率地说,我不确定我是否正确声明了输出参数,有人可以提供建议吗?

【问题讨论】:

  • 选择 SELECT @userid= SCOPE_IDENTITY();并删除它没有必要。
  • marc_s 不喜欢我的懒惰打字:P

标签: sql sql-server stored-procedures output-parameter


【解决方案1】:

您需要将值分配@userid!另外,我建议使用SCOPE_IDENTITY() 而不是@@IDENTITY

CREATE PROCEDURE Users_Insert
    -- Add the parameters for the stored procedure here
    @userid int output,
    @name varchar(50),
    @surname varchar(50),
    @email varchar(200),
    @password varchar(50),
    @location varchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    insert into Users(FirstName, LastName, Email, Password, Location)
    values(@name, @surname, @email, @password, @location);

    -- make an actual **assignment** here...
    SELECT @userid = SCOPE_IDENTITY();
END

See this blog post for an explanation as to WHY you should use SCOPE_IDENTITY over @@IDENTITY

【讨论】:

  • @Ortund:你有没有分配 - 你只有@userid = ... - 不是SETSELECT 关键字
  • Must declare the scalar varialbe "@userid" ... 每当我进入 sql server 时,一切都只是问题,问题,问题......这就是我转向 mysql 的原因 >_>
  • 过程中间的GO 无效。 @Ortund - 如果您没有输入有效的语法,yes 会导致您出现问题。当然,在 MySQL 中也是如此。
  • 现在我得到An SqlParameter with ParameterName '' is not contained by this SqlParameterCollection. ...我认为这意味着SP期待一个名为''的参数?
  • @Ortund:这是您的 调用 代码(C# 或 VB.NET)中的一个问题 - 这是一个完全不同的问题 - 作为一个单独的问题提出。
猜你喜欢
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
相关资源
最近更新 更多