sto facendo un SELECT
che utilizza CASE
per convertire i valori nvarchar in un tipo corretto, qualcosa di simile:caso allora clausola sempre valutata
SELECT CASE
WHEN @propType = 'money' THEN convert(money, datavalue)
[...]
ELSE datavalue
END
FROM [...]
Tuttavia, sembra che il convert
viene sempre eseguito, anche quando @propType
è non uguale al denaro. Esempio eseguibile:
declare @proptype nvarchar(50)= 'nvarchar'
declare @val nvarchar(10) = 'test'
select
case @proptype
when 'money' then convert(money, @val)
else @val
end
Perché è questo e come posso aggirarlo? La documentazione MSDN dice:
L'istruzione CASE valuta le sue condizioni in sequenza e si ferma con la prima condizione la cui condizione è soddisfatta. In alcune situazioni , un'espressione viene valutata prima che un'istruzione CASE riceva i risultati dell'espressione come input. Sono possibili errori nella valutazione di queste espressioni. Le espressioni aggregate che appaiono negli argomenti WHEN a un'istruzione CASE vengono valutate per prime, quindi fornito all'istruzione CASE. Ad esempio, la seguente query produce un errore di divisione per zero durante la produzione del valore dell'aggregato MAX . Ciò si verifica prima di valutare l'espressione CASE.
Non sono sicuro che questo sia rilevante, ma il linguaggio è piuttosto pesante per un non nativo, quindi forse lo è?
L'unico scopo di convertire in modo esplicito un 'varchar' a' money' quando è implicitamente riconvertito 'varchar' è, per quanto ne so per la formattazione di scopi e allora perché non si fa né riporlo nella formattazione desiderata per iniziare con o lasciare che il client gestisca la formattazione? –
I dati di origine non sono sotto il mio controllo. Nel caso concreto devo passare attraverso un bel po 'di cerchi per ottenere i dati in un formato tale da poterlo inserire nella tabella dei report per cui è destinato (che è correttamente digitato) – carlpett