簡體   English   中英

在執行存儲過程之前如何判斷數據庫中是否已存在記錄?

[英]How to tell if a record is already exists in the database before executing stored procedure?

我想創建一個存儲過程以將數據插入數據庫的表中,但是它應該是唯一的,因此我首先檢查輸入參數:

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

我的問題是,在執行存儲過程后,如何在代碼中判斷傳遞的參數是否未被接受為唯一值?

在我的表單中,我有一個按鈕(插入)和一個文本框(名稱),當用戶單擊插入時,文本值將傳遞到存儲過程,並且我想彈出一個消息框,警告用戶重復輸入

使用@@ ROWCOUNT確定某行受到影響,並將該值作為參數返回。 查看此答案: 如何獲得受存儲過程影響的記錄數?

你可以這樣做:

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 (為什么?但是他們可以。)而且他們可能不知道下游是否依賴於受影響的記錄數。 但是,如果是明確的,無論是選擇的值還是輸出參數,那么有人都可以說其他東西取決於該值。

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

存儲過程可以返回一個值。 您可以將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/zh-cn/library/ms188655.aspx]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM