Solved

help with Update query -- t-sql

Posted on 2013-06-05
11
235 Views
Last Modified: 2013-06-09
Hello Experts!

I am trying to capture an error message if the below transaction fails. In the CATCH block, I am setting the error message to @errormessage variable, but this will not work.

How can I capture that particular record for which the update failed?

declare @ErrorMessage varchar(4000) = ''

 BEGIN TRAN trn1
	BEGIN TRY
		update p
		set p.Professional_Id = s.Destination_Professional_Id
		from tblPhys p, dbo.Prof s
		where p.Professional_Id = s.Source_Professional_Id
		  and s.Source_Professional_Id IS NOT NULL
	      and EXISTS (SELECT * FROM dbo.tblPhys AS tp WHERE tp.Professional_Id = s.Destination_Professional_Id AND tp.PhysicianId = p.PhysicianId)
 COMMIT TRAN trn1
	END TRY
	BEGIN CATCH
		IF @@TRANCOUNT > 0 
		ROLLBACK TRAN trn1
		Set @ErrorMessage = @ErrorMessage +  ' Update Failed for ProfesstionalId from S: ' + convert(varchar(20), s.Destination_Professional_Id) + Error_message() + ' failed at trn1'
	END CATCH

Open in new window


Thanks in advance!!!!
0
Comment
Question by:ravichand-sql
  • 4
  • 3
  • 2
  • +1
11 Comments
 
LVL 65

Expert Comment

by:Jim Horn
ID: 39223864
For starters, the alias s is only active in the statement it is used, and not in future statements, so in your CATCH block s.anything will have no meaning.

>How can I capture that particular record for which the update failed?
afaik the only way to pull this off would be to select the ID of the record, save it in a variable, then perform your UPDATE.
0
 

Author Comment

by:ravichand-sql
ID: 39223875
So, you mean I have to do 2 updates instead of 1. one for capturing the value and the other for performing the actual update ??
0
 
LVL 75

Expert Comment

by:Aneesh Retnakaran
ID: 39223882
Inside the catch block use this

SELECT
    ERROR_NUMBER() AS ErrorNumber
    ,ERROR_SEVERITY() AS ErrorSeverity
    ,ERROR_STATE() AS ErrorState
    ,ERROR_PROCEDURE() AS ErrorProcedure
    ,ERROR_LINE() AS ErrorLine
    ,ERROR_MESSAGE() AS ErrorMessage;
0
What is SQL Server and how does it work?

The purpose of this paper is to provide you background on SQL Server. It’s your self-study guide for learning fundamentals. It includes both the history of SQL and its technical basics. Concepts and definitions will form the solid foundation of your future DBA expertise.

 

Author Comment

by:ravichand-sql
ID: 39223894
Aneesh,

But this will not give me the record that made the update fail, right?
0
 
LVL 65

Expert Comment

by:Jim Horn
ID: 39223919
>So, you mean I have to do 2 updates instead of 1. one for capturing the value and the other for performing the actual update ??
One select to capture the PK, then your update.
That way the PK is in a variable if needed in the CATCH block to display in a custom error message.

Unless one of my peers here can demonstrate this is possible in 1 statement, afraid so.
0
 
LVL 65

Assisted Solution

by:Jim Horn
Jim Horn earned 250 total points
ID: 39223920
... or, throw your UPDATE into a cursor, then you have every value already as a parameter.
0
 

Author Comment

by:ravichand-sql
ID: 39223966
Jim,

I never worked on a cursor before, could you give me a sample for the update script I have attached above?
0
 
LVL 65

Expert Comment

by:Jim Horn
ID: 39223987
>could you give me a sample for the update script I have attached above?
See http://msdn.microsoft.com/en-us/library/ms180169.aspx

Warning:  Not easy to learn.
0
 
LVL 75

Expert Comment

by:Aneesh Retnakaran
ID: 39224078
> But this will not give me the record that made the update fail, right?
thats correct, but you will get the error ...
0
 
LVL 75

Expert Comment

by:Anthony Perkins
ID: 39224187
I am trying to capture an error message if the below transaction fails
So why don't we start with what error are you are trying to capture caused by bad data? And please don't say any error.  Is is a Primary or Foreign Key or Check CONSTRAINT error?  What other errors are you trying to capture?
0
 
LVL 75

Accepted Solution

by:
Anthony Perkins earned 250 total points
ID: 39224210
What I am getting at is that you as the Developer know all the potential logical errors and should query for them explicitly.  We can certainly help you with that.

In the meantime, at the very least correct your code as follows:
DECLARE @ErrorMessage varchar(4000) = ''

BEGIN TRY
    UPDATE  p
    SET     p.Professional_Id = s.Destination_Professional_Id
    FROM    tblPhys p
            INNER JOIN dbo.Prof s ON p.Professional_Id = s.Source_Professional_Id
    WHERE   -- s.Source_Professional_Id IS NOT NULL  
            EXISTS ( SELECT 1
                     FROM   dbo.tblPhys AS tp
                     WHERE  tp.Professional_Id = s.Destination_Professional_Id
                            AND tp.PhysicianId = p.PhysicianId )
END TRY
BEGIN CATCH
    SET @ErrorMessage = @ErrorMessage + ' Update Failed for ProfesstionalId from S: ' + CONVERT(varchar(20), s.Destination_Professional_Id) + ERROR_MESSAGE() + ' failed at trn1'
END CATCH

Open in new window

Notes:

1.

The TRANSACTION is pointless

2.

Use ANSI JOINs

3.

The condition s.Source_Professional_Id IS NOT NULL is not necessary.  If it is NULL then it will be excluded because of the JOIN.
0

Featured Post

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

In this article I will describe the Detach & Attach method as one possible migration process and I will add the extra tasks needed for an upgrade when and where is applied so it will cover all.
In this article I will describe the Copy Database Wizard method as one possible migration process and I will add the extra tasks needed for an upgrade when and where is applied so it will cover all.
Via a live example, show how to setup several different housekeeping processes for a SQL Server.
Viewers will learn how to use the INSERT statement to insert data into their tables. It will also introduce the NULL statement, to show them what happens when no value is giving for any given column.

786 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question