2013-05-21 13 views
17

SQL Server 2008 R2 Management Studio nie rozpoznał mój rzut w poniższym przykładzie, to mówijestem w stanie używać rzucać SQL Server 2008 R2

błędna składnia w pobliżu Rzut

usiłuję aby podać tutaj błąd, więc mogę go obsłużyć w mojej witrynie, gdy ktoś wstawi tę samą wartość dwukrotnie.

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' to nowa funkcja w SQL Server ** ** 2012 **, a więc to nie jest (jeszcze) dostępne w 2008 R2 ..... –

+0

Furthemore, wydaje się konieczne, aby zakończyć instrukcja poprzedzająca RZECI średnikiem; w przeciwnym razie pojawi się błąd składni! – joedotnot

Odpowiedz

36

THROW komunikat wprowadza w SQL Server 2012

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

Można użyć RAISERROR zamiast.

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

Dziękuję bardzo, wszystko, czego potrzebuję, to ta mała informacja, że ​​Throw został wprowadzony na serwerze SQL 2012, i dziękuję za wyjaśnienie oświadczenia RAISERROR – user2405574

+0

Niewielka różnica. RAISERROR nie zatrzymuje wykonywania, podczas gdy robi to. –

+1

@ MehmetAVŞAR To nie jest dokładnie poprawne. Wykonanie nie jest zatrzymywane na podstawie tego, co jest RAISERROR lub THROW, zatrzymane na podstawie poziomu istotności. Za pomocą RAISERROR możesz ustawić samą intensywność, a następnie wybrać, co zostanie zatrzymane. Za pomocą THROW nie można ustawić wartości domyślnej 16, co powoduje zatrzymanie wykonywania, jednak w przypadku użycia z bloku CATCH przekazuje tylko ostatni znany wyjątek, który może być lub może nie być 16. –

3

Zastosowanie RAISERROR zamiast rzucać się w swoim bloku 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

Dziękuję za sugestie i za zastosowanie Twojej sugestii na moim dokładnym przykładzie :) – user2405574

+0

Co jeśli 'ERROR_MESSAGE() LIKE '% [%] s%'' lub coś takiego? – binki

Powiązane problemy