[SQL Server] StoredProcedure

Miathan

Grünschnabel
Hallo!
Ich versuche nun seit über einer Stunde ein SP für den SQL Server zu schreiben.
Die SP soll eine Url in die Datenbank eintragen oder aktualisieren wenn diese schon darin steht und mir in beiden Fällen die UrlID zurückliefern, weil ich diese noch weiterverarbeiten will.

Der Code sieht momentan so aus:
Code:
CREATE PROCEDURE IncrementUrl 
(
   @PortalID int,
   @Url nvarchar(250),
   @UrlID int OUTPUT
)
AS

SELECT 
    *
FROM
    Statistic

WHERE
    Url=@Url
    AND
    PortalID=@PortalID

/* only insert if the record doesn't yet exist */
IF @@Rowcount < 1

    INSERT INTO Statistic
    (
        PortalID,
        Url
    )

    VALUES
    (
        @PortalID,
        @Url
    )

ELSE

    UPDATE Statistic
	SET Counter = Counter + 1
    
    WHERE
        Url=@Url
        AND
        PortalID=@PortalID

    SELECT
        @UrlID = @@Identity
GO

Die Datenbank sieht so aus:

Code:
CREATE TABLE [dbo].[Statistic] (
	[UrlID] [int] IDENTITY (0, 1) NOT NULL ,
	[Url] [nvarchar] (250) COLLATE Latin1_General_CI_AS NOT NULL ,
	[PortalID] [int] NOT NULL ,
	[Counter] [int] NOT NULL 
) ON [PRIMARY]

Das mit der SELECT ... @@Identity Anweisung haut auch nicht hin. Als Antwort bekomme ich immer DBNull zurück. Im IF Part habe ich ein ähnliches Statement gar nicht erst hin bekommen.

Ich hoffe mir kann jemand helfen. Wenn jemand einen Tip für ein gutes Buch über das erstellen von SP hat wäre ich auch dankbar.

Gruß
Miathan
 
OK. Ich frage mich ob mein Problem außergewöhnlich, ungewöhlich oder einfach nur tivial ist?

Die Grundroutine der SP stammt aus dem IBS Portal von Microsoft. Ich wollte sie nur dahingehend ändern, das ich mit einer SP zwei Tabellen aktualisieren kann.
Deshalb brauche ich die UrlID um die zweite Tabelle zu aktualiseren. Wenn das innerhalb der gleichen SP gehen würde wäre dies doch ideal, oder?

Wer Ideen hat bitte melden, es muß ja nicht gleich die Lösung gepostet werden.

Gruß
Miathan
 
So. Ich hab jetzt eine Lösung des Problems gefunden. Die Update Funktion liefert anders als die Insert Funktion keinen Datensatz zurück. Deshalb ist die @@Identity immer leer. Mann muß also via Select nochmals den geänderten Datensatz abrufen:

Code:
SELECT @UrlID=UrlID 
FROM Statistic 
WHERE 
   Url=@Url
   AND
   PortalID=@PortalID

So sollte es funktionieren. Tut es zumindest bei mir.

Gruß
Miathan
 

Neue Beiträge

Zurück