Jedes Beispiel ist zugleich ein Test: der Katalog läuft im Testlauf gegen einen echten Server und muss sein hinterlegtes Ergebnis
liefern — was hier steht, ist genau das, was ausgeführt wird.
Typen
BOOLEAN mit TRUE, FALSE und UNKNOWN
BOOLEAN ist ein echter Typ (T031): ein Vergleich ist ein Wert, IS TRUE/IS UNKNOWN prüft ihn, auch wenn er NULL ist.
SELECT TRUE AS wahr, (1 > 2) AS vergleich, (NULL = 1) IS UNKNOWN AS unbekannt;
Erwartetes Ergebnis
wahr | vergleich | unbekannt
True | False | True
Literale
0x als Zahl, X'…' als Binärwert
Nach SQL:2023 (T661) ist 0x1F eine Ganzzahl; ein Binärwert schreibt sich X'1F'. Zahlen dürfen Unterstriche als Trenner tragen (1_000).
SELECT 0x1F AS zahl, X'1F' AS binaer, 1_000 + 1 AS mit_trenner;
Erwartetes Ergebnis
zahl | binaer | mit_trenner
31 | 0x1F | 1001
Abfragen
OFFSET und FETCH FIRST
Die Norm blättert mit OFFSET … ROWS und FETCH FIRST … ROWS ONLY; WITH TIES nimmt Gleichstand mit.
SELECT n FROM (VALUES (3), (1), (2), (2)) AS t (n)
ORDER BY n OFFSET 1 ROW FETCH FIRST 1 ROW WITH TIES;
Erwartetes Ergebnis
n
2
2
WITH RECURSIVE
Eine rekursive gemeinsame Tabelle trägt in der Norm das Wort RECURSIVE.
WITH RECURSIVE zahlen (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM zahlen WHERE n < 4)
SELECT SUM(n) AS summe FROM zahlen;
Erwartetes Ergebnis
summe
10
Vergleiche
IS DISTINCT FROM
IS [NOT] DISTINCT FROM vergleicht so, dass NULL gleich NULL ist - ohne ISNULL-Umweg.
SELECT CASE WHEN NULL IS NOT DISTINCT FROM NULL THEN 'gleich' ELSE 'verschieden' END AS nullen,
CASE WHEN 1 IS DISTINCT FROM NULL THEN 'verschieden' ELSE 'gleich' END AS eins_null;
Erwartetes Ergebnis
nullen | eins_null
gleich | verschieden
Regeln
UNIQUE lässt mehrere NULL zu
Wo T-SQL und Norm verschieden rechnen, gilt am KSQL-Zugang die Norm: NULL ist nie gleich NULL, ein UNIQUE-Schlüssel nimmt beliebig viele NULL (T-SQL: eine).
CREATE TABLE Pruefstand_Eindeutig (Id int PRIMARY KEY, Kennung varchar(10) UNIQUE);
INSERT INTO Pruefstand_Eindeutig VALUES (1, NULL), (2, NULL), (3, 'A');
SELECT COUNT(*) AS zeilen, COUNT(Kennung) AS mit_kennung FROM Pruefstand_Eindeutig;
DROP TABLE Pruefstand_Eindeutig;
Erwartetes Ergebnis
zeilen | mit_kennung
3 | 1
Transaktionen
START TRANSACTION und Sicherungspunkte
Transaktionen nach der Norm: START TRANSACTION, SAVEPOINT, ROLLBACK TO SAVEPOINT, COMMIT. Ohne offene Transaktion ist COMMIT erlaubt.
CREATE TABLE Pruefstand_Buchung (Id int PRIMARY KEY, Betrag int);
START TRANSACTION;
INSERT INTO Pruefstand_Buchung VALUES (1, 100);
SAVEPOINT vor_fehler;
INSERT INTO Pruefstand_Buchung VALUES (2, 999);
ROLLBACK TO SAVEPOINT vor_fehler;
COMMIT;
COMMIT;
SELECT Id, Betrag FROM Pruefstand_Buchung;
DROP TABLE Pruefstand_Buchung;
Erwartetes Ergebnis
Id | Betrag
1 | 100
Kennung
Wer antwortet
Der KSQL-Zugang sagt ehrlich, wer er ist: @@VERSION und SERVERPROPERTY nennen KuonenSQL und seine Fassung, nicht SQL Server.
SELECT LEFT(@@VERSION, 9) AS produkt, CAST(SERVERPROPERTY('Edition') AS nvarchar(20)) AS ausgabe;
Erwartetes Ergebnis
produkt | ausgabe
KuonenSQL | KuonenSQL