9

Chcę napisać funkcję zdefiniowaną przez użytkownika innego niż CLR w SQL Server 2005. Ta funkcja pobiera ciąg wejściowy i zwraca ciąg wyjściowy. Jeśli ciąg wejściowy jest nieprawidłowy, chcę wskazać błąd dla osoby dzwoniącej.Obsługa błędów w funkcjach zdefiniowanych przez użytkownika

Moją pierwszą myślą było użycie RAISERROR do podniesienia wyjątku. Jednak SQL Server nie pozwala na to wewnątrz UDF (choć można podnieść wyjątki w UDF opartych na CLR, idź rysunek).

Ostatnią możliwością jest zwrócenie wartości NULL (lub innej wartości wskaźnika błędu) z funkcji, jeśli wartość wejściowa jest błędna. Jednak nie lubię tej opcji, ponieważ:

  1. nie dostarcza żadnej użytecznej informacji rozmówcy
  2. nie pozwala mi zwrócić NULL w odpowiedzi na ważny wkład (ponieważ jest on używany jako kod błędu).

Czy istnieje sposób przyjazny dla wywoływania funkcji zatrzymania funkcji na błąd w SQL Server?

Odpowiedz

7

Wygląda na to, że UDF programu SQL Server są nieco ograniczone w ten (i wiele innych) sposób.

Naprawdę nie można wiele z tym zrobić - to (na razie) po prostu tak, jak jest. Albo możesz zdefiniować swój UDF, aby można było zasygnalizować warunek błędu za pomocą jego wartości zwracanej (np. Zwracając NULL w przypadku błędu), albo wtedy prawie musiałbyś uciekać się do zapisu procedury przechowywanej zamiast tego, która może mieć o wiele więcej obsługi błędów i pozwala na RAISERROR i tak dalej.

Zaprojektuj swój UDF tak, aby nie wymagał specyficznej sygnalizacji błędów, lub musisz ponownie zaprojektować swoje podejście do korzystania z procedur przechowywanych (które mogą mieć wiele parametrów WYJŚCIA, a więc mogą również zwracać kod błędu wraz z Twoimi danymi ładunek, jeśli tego potrzebujesz) lub zarządzany kod CLR dla twoich UDF.

Przepraszam, nie mam lepszego pomysłu - na razie obawiam się, że to twoje opcje - wybierz.

Marc

+0

Spodziewałem się tyle, ale myślałem, że zapytam. Dzięki. –

+1

Problem z programami szpiegującymi polega na tym, że nie można ich wywoływać w sposób, w jaki można, za pomocą funkcji. –

+0

Zgadzam się z @MikeK. Cały powód używania UDF, a nie pełnej procedury stored_procedure, jest przeznaczony do użytku inline. Czy odpowiedź na to pytanie została zmieniona w nowszych wersjach SQL Server? (np. 2016) – ColinMac

1

Jest możliwe rozwiązanie podane w odpowiedzi na duplikatu pytanie here, na podstawie tego pomysłu:

return cast('Error message here.' as int); 

Która rzuca coś takiego:

Msg 245, Level 16, State 1, Line 1 
Conversion failed when converting the varchar value 'Error message here.' to data type int. 

Działa OK dla funkcji UDF o wartościach skalarnych, ale nie dla wartości o wartościach tabelarycznych.

+0

Przypuszczam, że możliwe byłoby zwrócenie tekstu błędu w oczekiwanym formacie tabeli, tak? – ColinMac