Jestem całkowicie pod drzewem w odniesieniu do sposobu T-SQL
obsługuje type precedence z różnymi typami numeric
używanych w wyrażeniu CASE
. Czy mógłbyś wyjaśnić stosując następujący test:Pierwszeństwo typów numerycznych w T-SQL
-- Consider the query:
SELECT
CASE
WHEN 1=1 THEN CAST(1.555 AS numeric(16,3))
ELSE CEILING((1+1) * CAST(1 AS Numeric(16,2)) * CAST(1 AS int))
END AS Test
-- This returns 2 (scale = 0)
-- Now, remove the CEILING function:
SELECT
CASE
WHEN 1=1 THEN CAST(1.555 AS numeric(16,3))
ELSE (1+1) * CAST(1 AS Numeric(16,2)) * CAST(1 AS int)
END AS Test
-- and it gives 1.56 (scale = 2)
-- Now replace (1+1) with 2:
SELECT
CASE
WHEN 1=1 THEN CAST(1.555 AS numeric(16,3))
ELSE (2) * CAST(1 AS Numeric(16,2)) * CAST(1 AS int)
END AS Test
-- and it yields 1.555 (scale = 3)
Wydaje mi się źle, ponieważ we wszystkich trzech zapytań numeric(16,3)
w 1=1
oddziału powinny mieć pierwszeństwo nad mniej dokładnego wyniku ELSE
gałęzi.
Domyślam się, że analizator składni zapytań nie uwzględnia prawdziwej zakodowanej wartości true i ocenia zarówno dla zgodnego typu. Jeśli został wybrany z tabeli, wszystkie zwrócone wartości powinny być tego samego typu. – Paparazzi
@Blam: Wiem, że to nie wyjaśnia, a nawet wtedy wynikowy typ powinien być tym, który ma najwyższy priorytet (zgodnie ze specyfikacją odniesienia operatora CASE), co nie wydaje się być w tym przypadku. –
@Blam: Martwi mnie fakt, że robi * nie * bierze pod uwagę faktycznie wykonywaną gałąź ... –