【问题标题】:How to tell if a record is already exists in the database before executing stored procedure?在执行存储过程之前如何判断数据库中是否已经存在记录?
【发布时间】:2016-12-23 07:02:20
【问题描述】:

我想创建一个存储过程来将数据插入到数据库中的表中,但它应该是唯一的,所以我首先检查传入的参数:

create procedure SP_Insert
    @name varchar(50)
AS
    if not exists (select Name from Employees where Name = @name)
    begin 
        insert into Employess (Name) 
        values (@name)
    end

我的问题是,如何在我的代码中判断传递的参数在存储过程执行后是否没有被接受为唯一值?

在我的表单中,我有一个按钮(插入)和一个文本框(名称),当用户单击插入时,文本值将传递给存储过程,并且我想弹出一个消息框,警告用户输入重复

【问题讨论】:

  • 那么,如果您有 20 个名为 Mohamed 的人怎么办?听起来您需要使用不同的列来检查记录是否存在,还要对 SQL 进行一些基本阅读,这将帮助您更好地解决问题。
  • 这就是我在写上面的例子时想到的,我真正的表是国家表。
  • 那么您应该根据实际表格显示您的代码/示例..现在来吧..
  • 您还应该避免使用 sp_ 前缀,或者最好完全跳过前缀。 sqlperformance.com/2012/10/t-sql-queries/sp_prefix

标签: c# sql-server stored-procedures


【解决方案1】:

使用@@ROWCOUNT 确定行受到影响并将值作为参数返回。看到这个答案:How can I get the number of records affected by a stored procedure?

【讨论】:

  • 这里的最佳方法。
【解决方案2】:
create procedure SP_Insert
@name varchar(50), @result bit output
AS
if not exists (select Name from Employees where Name=@name)
begin 
insert into Employess (Name) Values (@name)
set @result = 1
End
else set @result = 0

【讨论】:

    【解决方案3】:

    存储过程可以返回一个值。 你可以把你的 SP 改成这样:

    create procedure SP_Insert
    @name varchar(50)
    AS
    BEGIN
        if not exists (select Name from Employees where Name=@name)
        begin 
           insert into Employees (Name) Values (@name)
           Return 0
        end
        else begin
           Return 1
        end
    END
    

    这里是 MSDN 文章的链接,其中包含更多详细信息和示例: [https://msdn.microsoft.com/en-us/library/ms188655.aspx]

    【讨论】:

    • 这行不通。 return 语句返回一个整数,用于指示执行的状态。如果你想得到一个返回值,你应该使用一个 OUTPUT 参数。
    • 是的,存储过程可以返回一个值 - 但只有一个 INT 值 - 不是字符串!!
    • @SeanLange 我认为这个答案是正确的。请参阅stackoverflow.com/questions/6210027/… 请删除不赞成票。
    • @Diego 最初是返回一个字符串文字。我仍然会对此投反对票,因为它使用 return 语句将数据传回。返回的数据应使用 OUTPUT 参数。甚至在现在链接到答案的文章中也指出了这一点。但由于它至少会满足要求,我想我不会反对它。
    • @Diego 我猜你赞成这个以“抵消”反对票。这不是应该如何工作的。如果这是使用输出参数,我认为这是值得投票的。
    【解决方案4】:

    你可以这样做:

    insert into Employess (Name) 
    select @name
    where not exists (select * from Employees where Name = @name)
    
    select @@rowcount
    

    现在@@rowcount(返回给调用者)是零还是一,取决于是否有插入。

    var recordsUpdated = command.ExecuteScalar();
    

    实际上,您可以跳过select @@rowocount 并且不明确返回任何内容。

    var recordsUpdated = command.ExecuteNonQuery();
    

    返回受影响记录的数量。我更喜欢更明确。有人可能会落后并更改程序,以便它执行其他更改 @@rowcount 的操作。 (为什么?但他们可以。)他们可能不知道下游的某些事情取决于受影响的记录数。但如果它是明确的,无论是选择值还是输出参数,那么有人可以判断出其他东西取决于该值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2022-01-21
      • 2015-08-17
      • 1970-01-01
      相关资源
      最近更新 更多