Någon som har ett alternativt förslag till hur man löser följande update / insert på ett annat sätt. Koden funkar på vissa SQL-servrar men inte andra :( Jag kan inte se några direkta fel i din procedur men vad menar du med att det inte funkar på "vissa" servrar? Det finns ju lite olika sätta att göra samma sak. Trevlig tanke att alltid kör update först och se hur många rader det blir. Jag har kommigt på hur jag kan göra för att mitt ursprungliga problem inte skall uppkomma ( [Process 51 generated fatal ....] )Insert eller update
<code>
CREATE PROCEDURE [spInsUp]
(@id [int],
@nvcName [nvarchar](50))
AS
IF EXISTS(SELECT [id] FROM tblName WHERE [id] = @id)
BEGIN
UPDATE [tblName]
SET [nvcName] = @nvcName
WHERE
( [id] = @id)
return @id
END
ELSE
BEGIN
INSERT INTO [tblName]
( [nvcName])
VALUES
( @nvcName)
return @@identity
END
</code>Sv: Insert eller update
Det kanske kan vara bra att istället för att använda en return-parameter använda SELECT istället. Det brukar jag göra.
Ex:
<code>
...
if exists (Select * from tbl_Users Where UserId = @UserId) begin
-- Gör update
SELECT @UserId as Result
end
else begin
-- Gör insert
SELECT @@identity as Result
end
...
</code>
Naturligtvis använder du inte returparametern för att ta reda på resultatet.
//Mikael SandSv: Insert eller update
Du kan använda count för att kolla om posten finns:
create procedure spInsUp
@id int,
@nvcName nvarchar(50)
as
set nocount on
declare @cnt int
select @cnt = count(*)
from tblName
where id = @id
if @cnt = 0 begin
insert into tblName (nvcName)
values (@nvcName)
set @id = scope_identity()
end else begin
update tblName
set nvcName = @nvcName
where id = @id
end
return @id
Ifall posten oftast finns så kan du köra update varje gång och använda rowcount för att kolla om posten fanns:
create procedure spInsUp
@id int,
@nvcName nvarchar(50)
as
set nocount on
update tblName
set nvcName = @nvcName
where id = @id
if @@rowcount = 0 begin
insert into tblName (nvcName)
values (@nvcName)
set @id = scope_identity()
end
return @id
Sv:Insert eller update