Stored procedure i SQL2000
Jag vill ha en stored procedure i SQL2000.
Denna SP skall skapa en ny post i en tabell som heter UPPDRAG_IN.
Inparametrar enl nedan. 4 st (IN_TID, IN_TEXT, IN_AVSANDARE, IN_REFNR)
IN_ID är ett identity-fält (sätts automatiskt)
SP:n skall innehålla felhantering.
Vid ev fel skall utparametern innehålla en nolla.
Vid OK skall utparametern innehålla tabellens ID (Räknare, identity)
Tabelllayout:
IN_ID Integer (Identity), ej med i SP:n
IN_TID DateTime
IN_TEXT Text (PM enl access vokabulär)
IN_AVSANDARE VarChar 150
IN_REFNR VarChar 50
Utparameter i SP:n
UT_SVAR Integer. (Noll vid fel, IN_ID vid OK)
Tacksam för snabbt svar.
/ Mikael
Svara
Sv: Stored procedure i SQL2000
Jag tror detta skall fungera. Till att börja med skippade jag inparametern för tiden, istället tas den tid från sql-servern som posten adderas. Därefter körs insert, om det inte lyckas rullar transaktionen tillbaks och 0 returneras. Om den lyckas så skickas id:t tillbaks till användaren.
Kallas med:
<code>
Set rst = con.execute("uppdrag_in '" & in_text & "','" & in_avsandare & "','" & in_refnr)
</code>
Sen har du proceduren:
<code>
CREATE PROCEDURE uppdrag_in
(
@IN_TEXT ntext
,@IN_AVSANDARE VarChar(150)
,@IN_REFNR VarChar(50)
)
AS
BEGIN
BEGIN TRAN
INSERT INTO uppdrag(
IN_TID
,IN_TEXT
,IN_AVSANDARE
,IN_REFNR
)
VALUES
(
GETDATE()
,@IN_TEXT
,@IN_AVSANDARE
,@IN_REFNR
)
IF @@error<>0 OR @@rowcount = 0
BEGIN
IF @@TRANCOUNT = 1
ROLLBACK TRAN
RETURN(0)
END
ELSE
Select @@identity
COMMIT TRAN
END
</code>
Svara
Sv: Stored procedure i SQL2000
Ett inlägg bara pelle...
när man ska läsa av identity värdet rekommenderas inte att man läser av @identity variabeln direkt då man inte kan vara säker på att den alltid innehåller korrekt variabel...
I MS SQL 2000 har man skapat en inbyggd funktion som just fokuserar på att returnera senast inlagda id-värdet, och den är bättre att nyttja...
SCOPE_IDENTITY() heter den
SELECT SCOPE_IDENTITY()
Svara
Sv: Stored procedure i SQL2000
SCOPE_IDENTITY, IDENT_CURRENT och @@IDENTITY är liknande funktioner, men man kan inte bara säga att man ska använda den ena eller den andra, eftersom de har vissa skillnader.
IDENT_CURRENT returnerar det senast skapade identity-värdet för en viss tabell.
SCOPE_IDENT returnerar det senast skapade identity-värdet i aktuellt scope, dvs procedur, trigger batch etc.
@@IDENTITY returnerar det senast skapade identity-värdet i den session man kör i, oberoende av scope.
Alltså kan man i ovanstående fall använda @@IDENTITY lika bra som SCOPE_IDENT, förutsatt att det inte finns en trigger på tabellen vilken i sin tur gör en ny insert i en annan tabell med en identity-kolumn. Då kommer @@IDENTITY att innehålla den andra tabellens identity-värde, medan SCOPE_IDENT innehåller den första tabellens identity-värde.
Svara