Hej! Hej Du kan lägga allt i en TRY-CATCH som skulle hantera de logiska felen och rulla tillbaka om det går fel. Starta en transaktion innanför TRY bara. Sedan får du hantera business felen med egen felhantering. ungefär som du gör nu fast inte med RETURN om det inte är som du vill utan ha istället en GOTO ERROR; som du placerar längst ner i koden men innan CATCH'en. Om du hamnar där så rullar du tillbaka allt och returnerar lämpligt fel. Har all uppdatering gått bra så ser du till att hoppa förbi ERROR avsnittet med hjälp av en GOTO END_SP; som du lämpligt placerar efter ERROR.Hjälp med en Sp i SQL2005
Jag har en Sp i SQL2005 som uppdaterar poster i en tabell.
Sen så vill jag lägga till delar av posten i en historik tabell
Jag vill ha med en koll att allt har gått igenom och om det inte gjort det göra en Rollback.
Men jag vet inte hur man gör det.
Tacksam för hjälp.
<Code #>
ALTER PROCEDURE [dbo].[p_maintainLicenceNew]
-- Add the parameters for the stored procedure here
@parmDelete char(10) ,
@parmOrg int ,
@parmLicNbr char(20) ,
@parmFirstName nvarchar(50) ,
@parmSurName nvarchar(50) ,
@parmAdress nvarchar(50) ,
@parmCoAdress nvarchar(50) ,
@parmZipCode nvarchar(10) ,
@parmCity nvarchar(50) ,
@parmPhoneHome nvarchar(20) ,
@parmPhoneWork nvarchar(20) ,
@parmPhoneMobile nvarchar(20) ,
@parmFax nvarchar(20) ,
@parmEmail nvarchar(75) ,
@parmAge DateTime ,
@parmCountyId int ,
@parmCounty nvarchar(50) ,
@parmClubId nvarchar(20) ,
@parmClub nvarchar(50) ,
@parmLicType int ,
@parmOldHcp int ,
@parmInactive bit ,
@parmSex nchar(1) ,
@parmDateChanged DateTime ,
@parmOK int output
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Error as Default
SET @parmOK = 1
DECLARE @varHcp int;
DECLARE @varOldHcp int;
DECLARE @varOldClubId int;
DECLARE @varNewClubId int
DECLARE @parmHistoryText nvarchar(1024)
-- Validate Org
IF(@parmOrg = '' OR @parmOrg = null)
BEGIN
RETURN 10
END
-- Validate LicNbr
IF(@parmLicNbr = '' OR @parmLicNbr = null)
BEGIN
RETURN 11
END
-- Validate FirstName
IF(@parmFirstName = '' OR @parmFirstName = null)
BEGIN
RETURN 12
END
-- Validate SurName
IF(@parmSurName = '' OR @parmSurName = null)
BEGIN
RETURN 13
END
-- Select record to validate if exist
SELECT @varHcp = Hcp
FROM dbo.bo_Licence
WHERE Org = @parmOrg AND LicNbr = @parmLicNbr
IF (@@rowcount > 0)
BEGIN
-- Set Old Items
SET @varOldHcp = (SELECT OldHcp FROM bo_Licence WHERE LicNbr = @parmLicNbr)
SET @varOldClubId = (SELECT clubId FROM bo_Club WHERE ClubId = (SELECT ClubId FROM bo_Licence WHERE LicNbr = @parmLicNbr))
SET @varNewClubId = (SELECT clubId FROM bo_Club where ClubId = @parmClubId)
-- Delete existing record
IF (@parmDelete = 'DELETE')
BEGIN
DELETE FROM dbo.bo_Licence
WHERE Org = @parmOrg AND LicNbr = @parmLicNbr
IF (@@error <> 0)
BEGIN
RETURN 14
END
END
ELSE
-- Update existing record
BEGIN
UPDATE dbo.bo_Licence
SET [FirstName] = @parmFirstName ,
[SurName] = @parmSurName ,
[Adress] = @parmAdress ,
[CoAdress] = @parmCoAdress ,
[ZipCode] = @parmZipCode ,
[City] = @parmCity ,
[PhoneHome] = @parmPhoneHome ,
[PhoneWork] = @parmPhoneWork ,
[MobilePhone] = @parmPhoneMobile ,
[Fax] = @parmFax ,
[Email] = @parmEmail ,
[Age] = @parmAge ,
[CountyId] = @parmCountyId ,
[ClubId] = @parmClubId ,
[LicType] = @parmLicType ,
[OldHcp] = @parmOldHcp ,
[Inactive] = @parmInactive ,
[Sex] = @parmSex
WHERE Org = @parmOrg AND LicNbr = @parmLicNbr
IF @parmLicType =20
BEGIN
SET @parmHistoryText = 'Byte av klubb'
END
ELSE
IF @parmLicType = 10
BEGIN
SET @parmHistoryText = 'Ny Licens'
END
ELSE
IF @parmLicType = 25
BEGIN
SET @parmHistoryText = 'Byte av Hcp'
END
ELSE
IF @parmLicType = 30
BEGIN
SET @parmHistoryText = 'Återinträde'
END
ELSE
IF @parmLicType = 40
BEGIN
SET @parmHistoryText = 'Avlicensierad'
END
ELSE
BEGIN -- Om det är licenstyp byte
SET @parmHistoryText = 'Byte av license Typ'
END
INSERT INTO bo_LicenceHistory
( HistoryLicNbr ,
HistoryDate ,
HistoryType ,
HistoryOldClubId ,
HistoryNewClubId ,
HistoryOldHcp ,
HistoryNewHcp ,
HistoryText ,
DateProceed )
VALUES
( @parmLicNbr ,
@parmDateChanged ,
@parmLicType ,
@varOldClubId ,
@parmClubId ,
@varOldHcp ,
@varOldHcp ,
@parmHistoryText ,
GETDATE())
END
END
ELSE
-- Create new record
BEGIN
IF (@parmDelete <> 'DELETE')
BEGIN
INSERT INTO dbo.bo_Licence
( Org ,
LicNbr ,
FirstName ,
SurName ,
Age ,
ClubId ,
OldHcp )
VALUES
( @parmOrg ,
@parmLicNbr ,
@parmFirstName ,
@parmSurName ,
@parmAge ,
@parmClubId ,
@parmOldHcp )
IF (@@error <> 0)
BEGIN
RETURN 17
END
END
END
SET @parmOK = 0
RETURN 0
END
</Code>Sv: Hjälp med en Sp i SQL2005
Vill bara påpeka en sak i din SP.
I början där du gör ett par "Valideringar", så skriver du så här:
<code>
-- Validate Org
IF(@parmOrg = '' OR @parmOrg = null)
BEGIN
RETURN 10
END
</code>
I just det här exemplet så försöker du kolla om @parmOrg är lika med en tom sträng.
@parmOrg är en int så det kan du ta bort.
Sedan så gör du en kontroll om parametern är = NULL.
I SQL Server skriver man "@parmOrg IS NULL" om man vill kontrollera NULL.
Som det är nu så blir IF satsen aldrig "TRUE" om parametern är NULL.
Har inte tid att hjälpa dig med det andra just nu.
Återkommer senare om ingen annan gör det före. Sv: Hjälp med en Sp i SQL2005
Lycka tillSv:Hjälp med en Sp i SQL2005
finns en bra artikel i ämnet här:
http://www.4guysfromrolla.com/webtech/041906-1.shtml
men ungefär så här kan du göra.
BEGIN TRY
BEGIN TRANSACTION
... din kod ...
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
END CATCH