Note: This question is part of a series of questions that present the same scenario. Each question in
the series contains a unique solution that might meet the stated goals. Some question sets might havemore than one correct solution, while others might not have a correct solution.
After you answer a question in this section. You will NOT be able to return to it. As a result, these
questions will not appear in the review screen.
You create a table named Products by running the following Transact-SQL statement:
You have the following stored procedure:
You need to modify the stored procedure to meet the following new requirements:
Insert product records as a single unit of work.
Return error number 51000 when a product fails to insert into the database.
If a product recordinsert operation fails, the product information must not be permanently written to the
database.
Solution: You run the following Transact-SQL statement:
Does the solution meet the goal?

A.
Yes
B.
No
Explanation:
A transaction is correctlydefined for the INSERT INTO ..VALUES statement, and if there is an error in the
transaction it will be caught ant he transaction will be rolled back. However, error number 51000 will not be
returned, as it is only used in an IF @ERROR = 51000 statement.
Note: @@TRANCOUNT returns the number of BEGIN TRANSACTION statements that have occurred on the
current connection.
https://msdn.microsoft.com/en-us/library/ms187967.aspx
I think @@ERROR can only return the error number, stored in the sys.messages catalog view, which is less than 50000.
4
0
I approve the answer
2
0
Correct answer.
But I disagree with the explanation.
WHY?
1) error number 51000 is in the range of user defined errors. so in this case for this SP it is uncatchable.
2) also the validation with @@trancount is incorrect, as you can have nested stored procedures. the correct validation should be with XACT_STATE() different from 0
1
0
correct answer,solo cambiar el bloque CATCH………..
BEGIN CATCH
IF XACT_STATE()0
THROW 51000,’Message Cstom!!!!!’,1
ROLLBACK TRANSACTION
END CATCH
0
0
The @@ERROR statment should be first in CATCH clause, because only then we can catch the error number.
Example:
BEGIN TRY
BEGIN TRANSACTION TRAN1
declare @i as int = 1/0
COMMIT TRANSACTION
END TRY
BEGIN CATCH
SELECT @@ERROR
IF(@@TRANCOUNT > 0)
ROLLBACK TRANSACTION TRAN1
—-OR—–
BEGIN TRY
BEGIN TRANSACTION TRAN1
declare @i as int = 1/0
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF(@@TRANCOUNT > 0)
ROLLBACK TRANSACTION TRAN1
SELECT @@ERROR
END CATCH
0
0