Några gånger har en nedan SP "slutat fungera" dvs time out. Det mest besynnerliga är att när detta inträffar så går det att göra manuella Select/Update/Insert från Query Analyser. Väldigt frustrerande. Tror dock att jag är felet på spåret genom följande KB: http://support.microsoft.com/default.aspx?scid=kb;en-us;259466 Något jag undrar över är om det är mer effektivt att skriva: Nja, en EXISTS tar inte lång tid alls, åtminstone inte om man har index för den. Men visst, om man väntar sig att få många fler UPDATEs än INSERTs, då kan det ju vara värt att göra på Andreas vis, även om vinsten är minimal. Dock skulle jag använt @@ROWCOUNT istället för en egen @FOUND-variabel (även om det inte är någon prestandamässig skillnad tycker jag det är snyggare):SP som låser sig ibland... ?
Någon som vet mer?
<code>
CREATE Procedure A_Statistic_NewVisit
@CustomerID int
As
set nocount on
DECLARE @datum datetime
set @datum = substring(convert(varchar(10),getdate(),120),1,10)
if EXISTS(select CustomerID from Statistic where VisitDate=@datum and CustomerID=@CustomerID)
begin
update Statistic set Visits = Visits + 1 where VisitDate=@datum and CustomerID=@CustomerID
end
else
begin
insert into Statistic(CustomerID, Visits, Visitdate) values(@CustomerID,1,@Datum)
end
return
GO
</code>Sv: SP som låser sig ibland... ?
CREATE Procedure A_Statistic_NewVisit
@CustomerID int
As
set nocount on
DECLARE @Datum datetime
DECLARE @Found
SET @Found = 0
SET @datum = substring(convert(varchar(10),getdate(),120),1,10)
UPDATE Statistic SET @Found = 1, Visits = Visits + 1
WHERE VisitDate = @datum AND CustomerID=@CustomerID
IF @Found = 0
INSERT INTO Statistic(CustomerID, Visits, Visitdate)
VALUES(@CustomerID, 1, @Datum)
RETURN
GO
Du slipper ju på så sätt Existen. Frågan är Om en Exist tar mer eller mindre tid än att kontrolera med en update-sats?Sv: SP som låser sig ibland... ?
CREATE Procedure A_Statistic_NewVisit
@CustomerID int
As
set nocount on
DECLARE @Datum datetime
SET @datum = substring(convert(varchar(10),getdate(),120),1,10)
UPDATE Statistic SET Visits = Visits + 1
WHERE VisitDate = @datum AND CustomerID=@CustomerID
IF @@ROWCOUNT = 0
INSERT INTO Statistic(CustomerID, Visits, Visitdate)
VALUES(@CustomerID, 1, @Datum)
RETURN
GO