Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
Author |
Topic |
marclas
Starting Member
16 Posts |
Posted - 2012-08-09 : 12:00:48
|
Hi, I have wrote the next procedure[code="sql"]USE [RECLACSR-DB]GO/****** Object: StoredProcedure [dbo].[InfoPrComplement] Script Date: 08/09/2012 15:00:58 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author: <Author,,Name>-- Create date: <Create Date,,>-- Description: <Description,,>-- =============================================ALTER PROCEDURE [dbo].[InfoPrComplement] -- Add the parameters for the stored procedure here @node nchar (10), @resultat nvarchar (100) ='Paiement Complet' outputASBEGIN -- SET NOCOUNT ON added to prevent extra result sets from SET NOCOUNT ON; begin transaction ----Verifier la valeur du titre begin Try Declare @Valeurtitre int; set @Valeurtitre = (select PAR_CATEGORIE.CAT_MONTANT from CSR_DOSSIER,PAR_CATEGORIE where CSR_DOSSIER.CAT_CODE = PAR_CATEGORIE.CAT_CODE and CSR_DOSSIER.DOS_NODE = @node); Declare @Montantverser int; set @Montantverser = (Select SUM (dbo.CSR_COMPLEMENT.CMP_MTVERSE) From dbo.CSR_COMPLEMENT WHERE dbo .CSR_COMPLEMENT.DOS_ID =(SELECT dbo.CSR_DOSSIER.DOS_ID FROM dbo.CSR_DOSSIER WHERE DOS_NODE =@node )); if (@Montantverser = @Valeurtitre ) begin -----------resultat "Paiement complet" set @resultat = 'Paiement complet'; end else begin SELECT dbo.CSR_DOSSIER.DOS_NOM +' '+ ISNULL ( dbo .CSR_DOSSIER.DOS_PRENOM, ' ') as Nom, CSR_DOSSIER.PID_CODE +' - '+PAR_PIDENT.PID_LIB AS Poste , CSR_DOSSIER.TIT_CODE +' - '+ PAR_TITRE.TIT_LIB AS Titre , CSR_DOSSIER.CAT_CODE, dbo.PAR_CATEGORIE.CAT_MONTANT, (Select SUM (dbo.CSR_COMPLEMENT.CMP_MTVERSE) From dbo.CSR_COMPLEMENT WHERE dbo .CSR_COMPLEMENT.DOS_ID =(SELECT dbo.CSR_DOSSIER.DOS_ID FROM dbo.CSR_DOSSIER WHERE DOS_NODE =@node )) as MontantVerse FROM dbo.CSR_DOSSIER ,dbo.PAR_CATEGORIE ,dbo.PAR_PIDENT, PAR_TITRE WHERE dbo .CSR_DOSSIER.DOS_ID =(SELECT dbo.CSR_DOSSIER.DOS_ID FROM dbo.CSR_DOSSIER WHERE DOS_NODE =@node ) AND CSR_DOSSIER.CAT_CODE = PAR_CATEGORIE .CAT_CODE AND CSR_DOSSIER.PID_CODE = PAR_PIDENT.PID_CODE AND CSR_DOSSIER.TIT_CODE = PAR_TITRE.TIT_CODE; set @resultat ='Paiement Partiel'; end return @resultat end try begin catch SELECT ERROR_PROCEDURE() AS ErrorProcedure ,ERROR_LINE() AS ErrorLine,ERROR_MESSAGE() AS ErrorMessage; -----------IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; end catchEND[/code]it's compile well, but when i execute , althought i have teh result, ialso got thesse error quote: Msg 266, Niveau 16, État 2, Procédure InfoPrComplement, Ligne 0Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 7, current count = 8.(1 ligne(s) affectée(s))(1 ligne(s) affectée(s))Msg 3998, Niveau 16, État 1, Ligne 1Uncommittable transaction is detected at the end of the batch. The transaction is rolled back.
And I don't know why.My return value also gives this messageErrorProcedure ErrorLine ErrorMessageInfoPrComplement 53 Conversion failed when converting the nvarchar value 'Paiement Partiel' to data type int.@resultatNULLReturn Value-6thanks for your helpMarclas |
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2012-08-09 : 12:05:57
|
i cant see begin tran. where exactly are you starting transaction?------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/ |
|
|
Lamprey
Master Smack Fu Yak Hacker
4614 Posts |
Posted - 2012-08-09 : 13:09:19
|
There is no commit.. try this:BEGIN-- SET NOCOUNT ON added to prevent extra result sets fromSET NOCOUNT ON;----Verifier la valeur du titrebegin Try begin transaction Declare @Valeurtitre int; set @Valeurtitre = (select PAR_CATEGORIE.CAT_MONTANT from CSR_DOSSIER,PAR_CATEGORIE where CSR_DOSSIER.CAT_CODE = PAR_CATEGORIE.CAT_CODE and CSR_DOSSIER.DOS_NODE = @node); Declare @Montantverser int; set @Montantverser = (Select SUM (dbo.CSR_COMPLEMENT.CMP_MTVERSE) From dbo.CSR_COMPLEMENT WHERE dbo .CSR_COMPLEMENT.DOS_ID =(SELECT dbo.CSR_DOSSIER.DOS_ID FROM dbo.CSR_DOSSIER WHERE DOS_NODE =@node )); if (@Montantverser = @Valeurtitre ) begin -----------resultat "Paiement complet" set @resultat = 'Paiement complet'; end else begin SELECT dbo.CSR_DOSSIER.DOS_NOM +' '+ ISNULL ( dbo .CSR_DOSSIER.DOS_PRENOM, ' ') as Nom, CSR_DOSSIER.PID_CODE +' - '+PAR_PIDENT.PID_LIB AS Poste , CSR_DOSSIER.TIT_CODE +' - '+ PAR_TITRE.TIT_LIB AS Titre , CSR_DOSSIER.CAT_CODE, dbo.PAR_CATEGORIE.CAT_MONTANT, (Select SUM (dbo.CSR_COMPLEMENT.CMP_MTVERSE) From dbo.CSR_COMPLEMENT WHERE dbo .CSR_COMPLEMENT.DOS_ID =(SELECT dbo.CSR_DOSSIER.DOS_ID FROM dbo.CSR_DOSSIER WHERE DOS_NODE =@node )) as MontantVerse FROM dbo.CSR_DOSSIER ,dbo.PAR_CATEGORIE ,dbo.PAR_PIDENT, PAR_TITRE WHERE dbo .CSR_DOSSIER.DOS_ID =(SELECT dbo.CSR_DOSSIER.DOS_ID FROM dbo.CSR_DOSSIER WHERE DOS_NODE =@node ) AND CSR_DOSSIER.CAT_CODE = PAR_CATEGORIE .CAT_CODE AND CSR_DOSSIER.PID_CODE = PAR_PIDENT.PID_CODE AND CSR_DOSSIER.TIT_CODE = PAR_TITRE.TIT_CODE; set @resultat ='Paiement Partiel'; end commit transaction return @resultat end trybegin catchIF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;SELECT ERROR_PROCEDURE() AS ErrorProcedure ,ERROR_LINE() AS ErrorLine,ERROR_MESSAGE() AS ErrorMessage;end catchEND |
|
|
marclas
Starting Member
16 Posts |
Posted - 2012-08-10 : 03:33:03
|
Merci!!thanks!Marclas |
|
|
marclas
Starting Member
16 Posts |
Posted - 2012-08-10 : 05:08:28
|
thanks a lot.is it possible for procedure to have 02 output parameters?how can i do it? and use themMarclas |
|
|
Transact Charlie
Master Smack Fu Yak Hacker
3451 Posts |
Posted - 2012-08-10 : 05:42:24
|
you can have any number of OUTPUT parameters.The RETURN parameter should only be used for error levels.Here's an example:USE tempdbGOIF OBJECT_ID('foo') IS NOT NULL DROP PROCEDURE fooGOCREATE PROCEDURE foo @bar INT OUTPUT, @woo INT OUTPUTAS BEGIN SET @bar = 3 SET @woo = 5 RETURN 55676ENDGODECLARE @a INT , @b INT , @c INTSELECT @a,@b,@c-- Note that @c is not passed as OUTPUTEXEC @a = dbo.foo @bar = @b OUTPUT, @woo = @c SELECT @a,@b,@c You'll see that the values of @a and @b are set by the proc... @c is not because we didn't pass it with the OUTPUT clause to the sp.Setting @a this way (the return value of the sp) should only be used to check for an error.Transact CharlieMsg 3903.. The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION. http://nosqlsolution.blogspot.co.uk/ |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2012-08-10 : 10:53:45
|
http://www.sqlteam.com/article/stored-procedures-returning-data------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/ |
|
|
|
|
|
|
|