webForumDet fria alternativet

SQL kod: Har jag tänkt rätt?

2 svar · 466 visningar · startad av freddyk

freddykMedlem sedan okt. 2006103 inlägg
#1

Skulle behöva er hjälp med följande kod. Har jag tänkt rätt?

Tabeller:
lagerplatsBrochure
lagerplats

BEGIN		
		IF EXISTS(SELECT dbo.lagerplatsBrochure.fk_lpID FROM dbo.lagerplatsBrochure WHERE dbo.lagerplatsBrochure.fk_lpID = @lpid)
			BEGIN
				IF (@@ROWCOUNT = 2) -- OM Det kom tillbaka 2 rader vid Selecten ovan
					BEGIN
						DELETE FROM dbo.lagerplatsBrochure WHERE dbo.lagerplatsBrochure.fk_lpID = @lpid AND dbo.lagerplatsBrochure.fk_brSLank = @brid
						UPDATE dbo.lagerplats SET dbo.lagerplats.sammansatt = '0' WHERE dbo.lagerplats.LPExpID = @lpid
					END
				ELSE
					BEGIN
						IF(@@ROWCOUNT > 2) -- OM Det kom tillbaka fler än 2 rader vid Selecten ovan
							BEGIN
								DELETE FROM dbo.lagerplatsBrochure WHERE dbo.lagerplatsBrochure.fk_lpID = @lpid AND dbo.lagerplatsBrochure.fk_brSLank = @brid
							END
						ELSE  -- 1 rad tillbaka
							BEGIN
								IF(@@ROWCOUNT = 1)
									BEGIN
										DELETE FROM dbo.lagerplatsBrochure WHERE dbo.lagerplatsBrochure.fk_lpID = @lpid AND dbo.lagerplatsBrochure.fk_brSLank = @brid
									END
							END
					END
			END
END

Det jag vill är följande:
1 - Kolla ifall tabell lagerplatsBrochure har minst en lagerplats med ID = @lpid lagrad.
2 - Ifall den har det, och har 2 sådana ID (mha @@ROWCOUNT = 2). Ta bort lagerplatsen med @brid samt uppdatera tabell lagerplats.sammansatt = 0 där lagerplats.LPExpID = @lpid
3 - Annars, om det kom tillbaka fler än 2 rader (@@ROWCOUNT > 2). Ta enbart bort en rad i lagerplatsBrochure.
4 - Eller, om det kom tillbaka 1 rad (@@ROWCOUNT = 1). Ta enbart bort en rad i lagerplatsBrochure.

Stämmer det som jag tänkt skriva ovan? har jag gjort en tankevurpa ngnstans?

SQL Server 2005

Tackar på förhand för inputs!

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Du kan inte använda @@rowcount på det sättet. Den nollställs före varje statement. En if exists returnerar inga rader så @@rowcount är 0 efteråt.

declare @rows int
set @rows = (select count(*) 
    FROM dbo.lagerplatsBrochure 
  WHERE dbo.lagerplatsBrochure.fk_lpID = @lpid)
  if @rows = 1 begin ... end 
  else if @rows = 2 begin ... end
  else
freddykMedlem sedan okt. 2006103 inlägg
#3

LarsG skrev:

Du kan inte använda @@rowcount på det sättet. Den nollställs före varje statement. En if exists returnerar inga rader så @@rowcount är 0 efteråt.

declare @rows int
set @rows = (select count(*) 
    FROM dbo.lagerplatsBrochure 
  WHERE dbo.lagerplatsBrochure.fk_lpID = @lpid)
  if @rows = 1 begin ... end 
  else if @rows = 2 begin ... end
  else

ah. Suvveränt! Tack för hjälpen LarsG. Ska testa med det du skrev. :)

Tackar!

EDIT
Verkar fugnera bra! Tackar!

En annan kort fråga. Kan man på ngt sätt "stega" igenom en exekvering av en SP i SQL server 2005? Ungefär som debuggen i VS2005... Finns det ngn sådan funktion?

132 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)