L'instruction SQL suivante ci-dessous est un bon exemple de code SQL qui génère une exception avec des détails imbriqués. Il semble dans la partie catch de la déclaration que je ne peux obtenir des détails d'exception extérieure Could not create constraint. See previous errors
(pas très utile!). Ce que je veux est le message d'exception interne:Incident de message d'exception interne SQL Server try-catch
Présentation de contrainte FOREIGN KEY 'FK_TWO' sur la table 'TABLEAU2' peut provoquer cycles ou plusieurs chemins en cascade. Indiquez ON DELETE NO ACTION ou ON ACTUALISER SANS ACTION ou modifiez d'autres contraintes FOREIGN KEY (vous pouvez obtenir ce message en exécutant le code sans try-catch).
Dans le bloc Catch, comment cela peut-il être réalisé en T-SQL?
BEGIN TRY
BEGIN TRAN;
CREATE TABLE TABLE1 (USER_ID INTEGER NOT NULL PRIMARY KEY, USER_NAME
CHAR(50) NOT NULL);
CREATE TABLE TABLE2 (AUTHOR_ID INTEGER NOT NULL PRIMARY KEY, AUTHOR_NAME
CHAR(50) NOT NULL, LASTMODIFIEDBY INTEGER NOT NULL, ADDEDBY INTEGER NOT
NULL);
ALTER TABLE TABLE2 ADD CONSTRAINT FK_ONE FOREIGN KEY (LASTMODIFIEDBY)
REFERENCES TABLE1 (USER_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE TABLE2 ADD CONSTRAINT FK_TWO FOREIGN KEY (ADDEDBY)
REFERENCES TABLE1(USER_ID) ON DELETE NO ACTION ON UPDATE CASCADE;
COMMIT TRAN;
END TRY
BEGIN CATCH
DECLARE @ERROR_MSG NVARCHAR(MAX), @SEVERITY INT, @STATE INT
SELECT @SEVERITY = ERROR_SEVERITY(), @STATE = ERROR_STATE()
, @ERROR_MSG = ERROR_MESSAGE() + ' err src line: ' + CAST(ERROR_LINE() AS NVARCHAR(20)) + ' ' + ISNULL(ERROR_PROCEDURE(), '');
ROLLBACK;
-- RE-THROW EXCEPTION FOR DIAGNOSTIC VISIBILITY
RAISERROR (@ERROR_MSG ,@SEVERITY, @STATE);
END CATCH;
[Modifier]
Il semble donc après beaucoup de recherches qu'il n'y a pas de solution à ce problème. J'espère qu'ils vont corriger cela dans une version future.
Je ne pense pas qu'il existe un moyen de le faire. Voir aussi cette question connexe: [Capture de plusieurs messages d'erreur à partir d'une seule instruction] (http://stackoverflow.com/questions/3697492/capturing-multiple-error-messages-from-a-single-statement) –