En SQL 2008R2 o inferior la forma que teniamos de hacer el manejo de errores era utilizando el TRY y CATCH y luego en caso de ser necesario generar un error con RAISE ERROR. Cualquiera que esté familiarizado con el paradigma de objetos también lo está con el concepto de "lanzar excepciones". Este paso es lo que se ha implementado en esta nueva versión de SQL con la instrucción THROW.
Veamos un ejemplo de como manejabamos las excepciones antes:
-- ============================================= -- Create: Andrés Aiello -- Create date: 13/01/12 -- Description: Ejemplo de manejo de errores en SQL2012 -- ============================================= BEGIN TRY SELECT 1/0 END TRY BEGIN CATCH DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int SELECT @ErrMsg = ERROR_MESSAGE(), @ErrSeverity = ERROR_SEVERITY() RAISERROR(@ErrMsg, @ErrSeverity, 1) END CATCH GOEn cambio ahora con esta nueva instrucción sería:
-- ============================================= -- Create: Andrés Aiello -- Create date: 13/01/12 -- Description: Ejemplo de manejo de errores en SQL2012 -- ============================================= BEGIN TRY SELECT 1/0 END TRY BEGIN CATCH THROW 51000, 'Mensaje de error a elección!', 1; END CATCH GONuestra lógica no sufrió grandes cambios pero esto permite empezar a pensar en un paradigma de excepciones nuestro código.
Algunas diferencias entre el comportamiento de una y otra son:
RAISE ERROR
- El error debe estar definido en la sys.messages
- Los mensajes pueden utilizar el caracter % para ser parametrizados
- Se puede definir la severidad del error, siendo esta cualquier número, incluyendo las mas graves
- No se puede arrojar en cadena (hacia los llamadores) la excepción. Cuando se genera una nueva "pisa" la anterior
- El mensaje de error se define al momento de lanzar la excepción
- Los mensajes NO pueden ser parametrizados. Tener en cuenta que al generarse en el momento los mensajes, esto no debería ser un gran problema
- La severidad del error es siempre la misma, severidad 16
- Un sp que captura una excepción puede relanzarla tal como en cualquier entorno de objetos
Espero que les haya servido.
Para mas info:
http://msdn.microsoft.com/en-us/library/ee677615%28v=sql.110%29.aspx