【问题标题】:Using variable in SQL Server stored procedure在 SQL Server 存储过程中使用变量
【发布时间】:2016-04-10 23:05:42
【问题描述】:

我在 SQL Server 存储过程中使用了一个变量,但我遇到了问题。

我想向我的表中插入数据,但在插入之前,我想检查它是否已经存在,然后我只会更新该行。

在查询中它可以正常工作,但在存储过程中却不行。

我的查询是

create proc AddPeople
    @Code nvarchar(50),
    @Name nvarchar(50)
as
begin
    declare @PeopleID bigint

    select @PeopleID = id 
    from tbl_People 
    where code = @Code

    if @PeopleID is Null
    begin
        INSERT INTO tbl_People(Code, Name)
        VALUES(@Code, @Name) 

        SELECT @PeopleID = @@IDENTITY
    end
    else
    begin
        UPDATE tbl_People 
        SET Name = @name 
        WHERE id = @PeopleID
    end

    select @PeopleID as id
end

在第一个“if”中,@PeopleID 始终为 NULL,存储过程将行插入表中,但我有代码

【问题讨论】:

  • 你的代码有什么问题?
  • 在代码中始终设置@peopleID=NULL 并始终插入人员
  • 我想如果我的表中有@Code,只需更新行
  • 看起来它应该对我有用。你确定你肯定在执行这个存储过程吗?有时,如果您在 master 或 dbo 以外的模式中意外有一个,可能会混淆哪个实际正在运行。尝试在其中放置一条打印语句或其他内容,这样您就可以确定这是正在执行的语句,并打印出 Code 和 PeopleID 的值。也很高兴看到您要插入的表的定义
  • 我还建议使用 SCOPE_IDENTITY() 而不是其他任何东西(如@@IDENTITY)来获取新插入的标识值。 See this blog post for an explanation as to WHY

标签: sql sql-server variables stored-procedures


【解决方案1】:

如果id 没有默认值,您所描述的将会发生。通常,这样的id 将被声明为not null identity()。你的表是这样吗?

注意:您不需要匹配id。你可以这样做:

if (exists (select 1 from tbl_People where code = @Code))

条件逻辑然后:

update tbl_People set Name = @Name where code = @Code;

看来Code 在表中是唯一的,所以id 列可能甚至没有必要。

【讨论】:

  • 我在这张表上有 170000 行,并在其他表中使用了 ID
  • 并且Code列的类型是nvarchar,所以通过这个Condition搜索需要时间和使用cpu
  • @mpourbafrani 。 . .如果您关心的是性能,您只需要适当的索引。
  • 感谢今天我使用@peopleid=max(id) 而不是@peopleid=id 及其工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多