2017-06-16 2 views
0

In SQL Server 2016. Ich erstellte eine Spalte mit benutzerdefinierten Datentyp, die Regel binden. T-SQL-Skript wie:Wie benutzerdefinierte Fehlermeldung bei Regelprüfung aufgetreten? T-SQL

CREATE RULE [dbo].[R_typeYesNo] 
    AS @column IN ('Y', 'N') 
GO 

CREATE TYPE [dbo].[typeYesNo] 
    FROM VARCHAR (1) NULL 
GO 

EXECUTE sp_bindrule [R_typeYesNo], [typeYesNo] 
GO 

CREATE TABLE dbo.MyRuleTable (
    ID     int     identity, 
    ACTIVEYN    [dbo].[typeYesNo]  NULL, 
    CONSTRAINT [PK_MyRuleTable] PRIMARY KEY CLUSTERED ([ID] ASC) 
) 
GO 

INSERT INTO dbo.MyRuleTable(ACTIVEYN) 
VALUES('A') 
GO 

-- Exception here 

DROP TABLE dbo.MyRuleTable; 
DROP TYPE [dbo].[typeYesNo]; 
DROP RULE [dbo].[R_typeYesNo]; 
GO 

Wenn ein falscher Wert eingefügt, wird die Regelprüfung Ausnahmemeldung zurück:

Msg 513, Ebene 16, Status 0, Zeile 20 A-Säulen-Einsatz oder Update Konflikte mit einer Regel, die von einer vorherigen CREATE RULE-Anweisung auferlegt wurde. Die Anweisung wurde beendet. Der Konflikt ist in der Datenbank 'DB1', Tabelle 'dbo.MyRuleTable', Spalte 'ACTIVEYN' aufgetreten.

Ist möglich, kann die Nachricht anpassen?

Antwort

0

eine Nachricht individuelle Fehler Erstellen Sie Regeln für

EXEC sp_addmessage 
500021, 
10, 
'This is a custom error message for MyRule' 

Und das RAISERROR oder THROW Verwendung in CATCH Block verwenden

BEGIN try 
    -- Exception here 
END try 
BEGIN catch 
    IF Error_message() LIKE '%MyRuleTable%' 
     BEGIN 
      RAISERROR (500021,10,1) 
     END 
    ELSE 
     BEGIN 
      DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE(); 
      DECLARE @ErrorSeverity INT = ERROR_SEVERITY(); 
      DECLARE @ErrorState INT = ERROR_STATE(); 

      RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState); 
     END 
END catch 
Verwandte Themen