Warum bedeutet dieser CASE
Ausdruck:
SELECT CASE column
WHEN 'a' THEN '1'
WHEN 'b' THEN '2'
... c -> i
WHEN 'j' THEN '10'
WHEN 'k' THEN '11'
END [col]
FROM LinkedServer.database.dbo.table
Dieses Ergebnis produzieren?
Fehlermeldung: Meldung 8180, Ebene 16, Status 1, Zeile 1
Anweisung (en) konnte nicht vorbereitet werden.
Meldung 125, Ebene 15, Status 4, Zeile 1
Groß- / Kleinschreibung darf nur bis Ebene 10 verschachtelt werden.
Offensichtlich gibt es hier keinen verschachtelten CASE
Ausdruck, obwohl es mehr als 10 "Zweige" gibt.
Eine weitere Kuriosität. Diese Inline-Tabellenwertfunktion erzeugt denselben Fehler:
ALTER FUNCTION [dbo].[fn_MyFunction]
(
@var varchar(20)
)
RETURNS TABLE
AS
RETURN
(
SELECT CASE column
WHEN 'a' THEN '1'
WHEN 'b' THEN '2'
... c -> i
WHEN 'j' THEN '10'
WHEN 'k' THEN '11'
END [col]
FROM LinkedServer.database.dbo.table
)
Aber eine ähnliche TVF mit mehreren Aussagen funktioniert gut:
ALTER FUNCTION [dbo].[fn_MyFunction]
(
@var varchar(20)
)
RETURNS @result TABLE
(
value varchar(max)
)
AS
BEGIN
INSERT INTO @result
SELECT CASE column
WHEN 'a' THEN '1'
WHEN 'b' THEN '2'
... c -> i
WHEN 'j' THEN '10'
WHEN 'k' THEN '11'
END [col]
FROM LinkedServer.database.dbo.table
RETURN;
END
SELECT CASE v.V WHEN 'a' THEN 1 WHEN 'b' THEN 2 END FROM (VALUES ('a'), ('b')) AS v (V);
und dieSELECT CASE WHEN v.V = 'a' THEN 1 WHEN v.V = 'b' THEN 2 END FROM (VALUES ('a'), ('b')) AS v (V);
Übersetzung erfolgen in genau denselben Ausführungsplan (können Sie sich selbst davon überzeugen), in dem der CASE-Ausdruck wie folgt neu definiert wird:CASE WHEN [Union1002]='a' THEN (1) ELSE CASE WHEN [Union1002]='b' THEN (2) ELSE NULL END END
- Wie Sie sehen, mit Verschachtelung.