用于插入或更新数据库的SQL Server存储过程

用于插入或更新数据库的SQL Server存储过程,sql,sql-server,database,sql-server-2008,stored-procedures,Sql,Sql Server,Database,Sql Server 2008,Stored Procedures,我不熟悉存储过程,并尝试学习一些东西。我有一个数据库表,看起来像这样 Acc | Room | ID | Name | Email | Status | Date | Number =======+======+=====+======+========+========+========+======== (null) | 101 | 001 | ABC | (null) | EMP | (null) | (null) (null) | 102 | 002 |

我不熟悉存储过程,并尝试学习一些东西。我有一个数据库表,看起来像这样

 Acc   | Room |  ID | Name |  Email | Status |  Date  | Number 
=======+======+=====+======+========+========+========+========
(null) |  101 | 001 |  ABC | (null) |   EMP  | (null) | (null) 
(null) |  102 | 002 |  DEF | (null) |   TMP  | (null) | (null)   
我正在创建一个存储过程,以根据ID插入或更新数据库中的数据。并非所有记录都有要插入或更新的数据

CREATE PROCEDURE [dbo].[uspInsertorUpdate]
    @room char(35),
    @id char(12),
    @name varchar(64),
    @status varchar(50),
AS
BEGIN
    SET NOCOUNT ON;
    IF EXISTS (SELECT null FROM emp WHERE ID = @id)
    BEGIN
       UPDATE emp 
       SET Room = @room, ID = @id, Name = @name, Status = @status
       WHERE ID = @id
    END

    INSERT INTO emp (Room, ID, Name, Status)
    VALUES(@room, @id, @name, @status);
END

不确定这是否正确,这将创建其他空记录。

首先检查Id是否存在。如果它不存在,则它是一个insert else更新

存储过程的主体可以是:

BEGIN

declare @v_count int

select @v_count = count(ID) from emp
where ID = @id

if (@v_count = 0)
insert into emp (Room, ID, Name, Status)
values (@room, @id, @name, @status)

else
update emp
set Room = @room, Name = @name, Status = @status
where ID = @id

END

您使用的是MySQL还是SQL Server?看起来像后者;请不要使用MySQL标记,除非您实际使用该平台。“mysql”并不意味着“我的SQL代码”…更好的模式(不太容易死锁)是
UPDATE。。。其中ID=@ID;如果@@ROWCOUNT=0,则插入
@AaronBertrand如何声明@ROWCOUNT您不需要声明
@@ROWCOUNT
-它返回受上一条语句影响的行数。@AaronBertrand@@ROWCOUNT在有许多行数据要插入或更新时会有所帮助。这种方法会对表执行不必要的额外访问,使代码更容易死锁。不必要的额外访问?如果是
insert
,则访问次数为2次;如果
更新
,访问次数为2次。这是一致的。在这种情况下,访问是不必要的?不,如果您只是先
更新
,然后
@@ROWCOUNT
>0,那么它只是一个访问。