Ci scusiamo se questo non è adatto, ma in realtà questo è un "perché" piuttosto che un "come". Non sono sicuro che sia adatto, ma non conosco un posto migliore dove chiedere e non riesco a pensare a come dire a un google per ottenere quello che sto cercando.Valutazione SQL delle clausole IF
IF 'hell' = 'freezing over'
BEGIN
SELECT log(0)
END
Guarda questa affermazione. Non esiste un mondo in cui la clausola IF sia vera. Se provo a eseguirlo, mi aspetto che SQL passi oltre la clausola IF e passi alla fine. Invece ottengo:
An invalid floating point operation occurred.
Questo è bizzarro. Quindi immagino che sia proprio il modo in cui SQL fa la cosa. Tranne ...
IF 'hell' = 'freezing over'
BEGIN
SELECT 1/0
END
Non c'è nessun errore qui. L'affermazione nella clausola IF dovrebbe comunque generare un errore. Qualcuno potrebbe spiegare perché questo non sta accadendo?
Questo si è verificato durante il debugging di un enorme set di calcoli SQL in cui EXP (SUM (LOG())) viene utilizzato per accumulare dati all'interno di una clausola if. Posso modificare il codice per impedire che ciò accada di nuovo, ma perché sta valutando qualcosa all'interno di una clausola IF che non è soddisfatta.
Cheers.
MODIFICA: divertimento aggiuntivo. Prova a prendere? Pffft
IF 1=2
BEGIN
BEGIN TRY
SELECT SQRT(-1)
END TRY
BEGIN CATCH
END CATCH
END
non matematico:
IF 1=2
BEGIN
SELECT SUBSTRING('hello',-1,-1)
END
Gli avvertimenti ANSI non hanno fatto alcuna differenza, ma questo è il collegamento che penso di averne bisogno, grazie mille :) –
Benvenuto. Con ANSI_WARNINGS intendevo che se un "set ansi_warnings off" fosse emesso in qualsiasi momento, non vedresti un errore di divisione per zero. Poiché il compilatore non può mai sapere in anticipo lo stato del flag ANSI_WARNINGS quando viene eseguita la query compilata, deve ignorare qualsiasi espressione piegata che eleva una divisione per eccezione zero al momento della compilazione in quanto non è in grado di prevedere il comportamento desiderato. (Se fosse garantito che ansi_warnings fosse sempre disattivato, 1/0 passerebbe a NULL) –