用于插入或更新数据库的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,那么它只是一个访问。