2013-05-21 10 views
17

SQL Server 2008 R2 Management Studio non ha riconosciuto il mio tiro nell'esempio qui sotto, si diceSono in grado di utilizzare LANCIO SQL Server 2008 R2

sintassi non corretta in prossimità del tiro

sto cercando per generare un errore qui, quindi posso gestirlo nel mio sito Web quando qualcuno inserisce lo stesso valore due volte.

Begin Try 
insert into BusinessID (BusinessID) values (@ID) 
insert into BusinessID (BusinessID) values (@ID) 

End Try 

Begin Catch 

Print 'PK already exist' 
THROW 
End Catch 
+0

'THROW' è una caratteristica nuova ** ** ** in SQL Server 2012 ** e, quindi, non è (ancora) disponibile in 2008 R2 ..... –

+0

Furthemore, sembra è necessario terminare la dichiarazione precedente a THROW con un punto e virgola; altrimenti ottieni un errore di sintassi! – joedotnot

risposta

36

THROW Dichiarazione è stato introdotto in SQL Server 2012

http://msdn.microsoft.com/en-us/library/ee677615.aspx

È possibile utilizzare RAISERROR invece.

http://msdn.microsoft.com/en-us/library/483588bd-021b-4eae-b4ee-216268003e79(v=sql.105)

BEGIN CATCH 
    DECLARE @ErrorMessage NVARCHAR(4000); 
    DECLARE @ErrorSeverity INT; 
    DECLARE @ErrorState INT; 

    SELECT 
     @ErrorMessage = ERROR_MESSAGE(), 
     @ErrorSeverity = ERROR_SEVERITY(), 
     @ErrorState = ERROR_STATE(); 

    RAISERROR (@ErrorMessage, -- Message text. 
       @ErrorSeverity, -- Severity. 
       @ErrorState -- State. 
       ); 
END CATCH; 
+0

Grazie mille, tutto ciò di cui ho bisogno sono queste piccole informazioni che Throw è stato introdotto in SQL Server 2012, e vi ringrazio per aver chiarito la dichiarazione di RAISERROR – user2405574

+0

Una leggera differenza. RAISERROR non ferma l'esecuzione, mentre lo fa THROW. –

+1

@ MehmetAVŞAR Non è esattamente corretto. L'esecuzione non viene interrotta in base a RAISERROR o THROW, ma viene interrotta in base al livello di gravità. Con RAISERROR puoi impostare tu stesso la severità e quindi scegliere qualunque cosa verrà arrestata. Con THROW, non è possibile e il valore predefinito è 16 che interrompe l'esecuzione, tuttavia quando viene utilizzato dal blocco CATCH, inoltra solo l'ultima eccezione nota, che potrebbe essere o non essere 16. –

3

Uso RAISERROR invece di buttare in blocco SQL.

Begin Try 
insert into BusinessID (BusinessID) values (@ID) 
insert into BusinessID (BusinessID) values (@ID) 

End Try 

Begin Catch 

Print 'PK already exist' 
    DECLARE @ErrorMessage NVARCHAR(4000); 
    DECLARE @ErrorSeverity INT; 
    DECLARE @ErrorState INT; 

SELECT 
    @ErrorMessage = ERROR_MESSAGE(), 
    @ErrorSeverity = ERROR_SEVERITY(), 
    @ErrorState = ERROR_STATE(); 

-- Use RAISERROR inside the CATCH block to return error 
-- information about the original error that caused 
-- execution to jump to the CATCH block. 
RAISERROR (@ErrorMessage, -- Message text. 
      @ErrorSeverity, -- Severity. 
      @ErrorState -- State. 
      ); 
End Catch 
+0

Grazie per il tuo suggerimento e per applicare il tuo suggerimento sul mio esatto esempio :) – user2405574

+0

Cosa succede se 'ERROR_MESSAGE() LIKE '% [%] s%'' o qualcosa del genere? – binki