it-swarm-eu.dev

Co je ERROR_STATE () na serveru SQL a jak jej lze použít?

Četl jsem, že ERROR_STATE() může pomoci rozlišit mezi různými stavy/umístěními ve zdrojovém kódu, kde může nastat stejný typ chyby. Ale není mi úplně jasné, jak to může být užitečné.

Stavy MSDN:

ERROR_STATE() Vrátí číslo stavu chyby, která způsobila spuštění bloku CATCH konstrukce TRY… CATCH.

Jak se dá opravdu použít? Může mi někdo dát příklad, ty uvedené v tento referenční článek mi opravdu nepomohou vysvětlit věci dobře?

13
jaczjill

Účelem chybových stavů serveru SQL je, aby vývojový tým serveru SQL Server byl schopen v kódu identifikovat přesná místa systémových chyb, které byly vyvolány, vzhledem k tomu, že mnoho chyb je vyvoláno na více místech.

Vy jako koncový uživatel (tj. Vývojář aplikací používajících SQL Server) můžete podobně použít stav předaný do RAISERROR, aby vaše produktová podpora mohla identifikovat místo, kde procedura vyvolá chybu, například:

create procedure usp_my_proc
as
if <somecondition>
  raiserror(N'Error foo and bar', 16, 0);
if <someothercondition>
  raiserror(N'Error foo and bar', 16, 1);
go

Podívejte se, jak vám dva stavy umožňují později rozlišit, který chybový případ byl zasažen. Než řeknete „ale mohu se podívat na chybovou zprávu“ říkám vám jedno slovo: internacionalizace.

9
Remus Rusanu

Ne, nepomůže vám najít nic o tom, kde došlo k chybě. Zde je rychlý příklad. Pokud se pokusíte dělit 0, zobrazí se chybová zpráva s množstvím podrobností:

SELECT 1/0;

Výsledek:

Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.

Vidíte ten s názvem State, s hodnotou 1? ERROR_STATE() vrátí tuto hodnotu. Pokud tedy použijete TRY/CATCH:

BEGIN TRY
  SELECT 1/0;
END TRY
BEGIN CATCH
  SELECT ERROR_STATE();
END CATCH

Výsledek:

----
   1

To je vše. Ve většině scénářů není užitečné. Doporučuji, abyste si přečetli více informací o řešení chyb obecně, než se ponoříte příliš hluboko do konkrétních funkcí, které zní dobře.

http://msdn.Microsoft.com/en-us/library/ms175976.aspx

http://www.sommarskog.se/error_handling_2005.html

6
Aaron Bertrand

Krátká odpověď - nemůže. ERROR_STATE je v podstatě dílčí oddíl ERROR_NUMBER. Nemůže vám sdělit, jaký řádek kódu způsobil chybu (s výjimkou případů, kdy vám ERROR_NUMBER a ERROR_STATE společně řeknou příčinu chyby a poté je zřejmé, co je příčinou).

1
RB.