Kuonen SQL

Beispielkatalog

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