Solved

help with Update query -- t-sql

Posted on 2013-06-05
11
233 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
 

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
Complete VMware vSphere® ESX(i) & Hyper-V Backup

Capture your entire system, including the host, with patented disk imaging integrated with VMware VADP / Microsoft VSS and RCT. RTOs is as low as 15 seconds with Acronis Active Restore™. You can enjoy unlimited P2V/V2V migrations from any source (even from a different hypervisor)

 
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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

If you have heard of RFC822 date formats, they can be quite a challenge in SQL Server. RFC822 is an Internet standard format for email message headers, including all dates within those headers. The RFC822 protocols are available in detail at:   ht…
Use this article to create a batch file to backup a Microsoft SQL Server database to a Windows folder.  The folder can be on the local hard drive or on a network share.  This batch file will query the SQL server to get the current date & time and wi…
Via a live example, show how to backup a database, simulate a failure backup the tail of the database transaction log and perform the restore.
Via a live example, show how to set up a backup for SQL Server using a Maintenance Plan and how to schedule the job into SQL Server Agent.

910 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

Need Help in Real-Time?

Connect with top rated Experts

17 Experts available now in Live!

Get 1:1 Help Now