9

Desidero scrivere una funzione definita dall'utente non CLR in SQL Server 2005. Questa funzione accetta una stringa di input e restituisce una stringa di output. Se la stringa di input non è valida, voglio indicare un errore al chiamante.Gestione errori nelle funzioni definite dall'utente

Il mio primo pensiero è stato usare RAISERROR per sollevare un'eccezione. Tuttavia, SQL Server non lo consente all'interno di una UDF (sebbene sia possibile generare eccezioni nelle UDF basate su CLR, fare clic).

La mia ultima risorsa sarebbe quella di restituire un valore NULL (o qualche altro valore di errore) dalla funzione se il valore di input è errato. Tuttavia, non mi piace questa opzione, in quanto:

  1. non fornisce tutte le informazioni utili al chiamante
  2. non mi consente di restituire un NULL in risposta all'input valido (dal momento che è utilizzato come un codice di errore).

C'è un modo facile per la chiamata di arrestare una funzione su un errore in SQL Server?

risposta

7

Sembra che le UDF di SQL Server siano un po 'limitate in questo (e molti altri) modi.

Non si può davvero fare molto: è (per ora) proprio così com'è. Puoi definire la tua UDF in modo da poter segnalare una condizione di errore tramite il suo valore di ritorno (ad es. Restituendo NULL in caso di errore), altrimenti dovresti ricorrere alla scrittura di una stored procedure, che può avere molto più gestione degli errori e consente RAISERROR e così via.

Quindi, progettare l'UDF in modo che non richieda una segnalazione specifica delle condizioni di errore, oppure è necessario riprogettare il proprio approccio per utilizzare le stored procedure (che possono avere più parametri OUTPUT e quindi anche restituire il codice di errore insieme ai propri dati carico utile, se necessario) o codice CLR gestito per le UDF.

Mi spiace, non ho un'idea migliore - per ora, ho paura, quelle sono le tue opzioni - fai la tua scelta.

Marc

+0

Mi aspettavo tanto, ma ho pensato di chiederlo. Grazie. –

+1

Il problema con sprocs è che non è possibile chiamarli in linea come è possibile con le funzioni. –

+0

Sono d'accordo con @MikeK. L'intera ragione per cui sto usando l'UDF e non una stored_procedure completa è per l'utilizzo in linea. La risposta a questa domanda è stata modificata nelle versioni più recenti di SQL Server? (ad esempio, 2016) – ColinMac

1

C'è una soluzione possibile data in una risposta ad una domanda duplicato here, sulla base di questa idea:

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

che getta qualcosa di simile:

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

E funziona OK per UDF con valori scalari, ma non per quelli con valori di tabella.

+0

Suppongo che sarebbe possibile restituire il testo dell'errore all'interno della tabella prevista, sì? – ColinMac

Problemi correlati