Kuonen SQL

Handbuch

Syntax, Datentypen, Funktionen und Fehlernummern je Abfragesprache — jeder Abschnitt mit einem Beispiel aus dem Beispielkatalog und, wo die Sprache einen eigenen Sprachmeilenstein der Roadmap hat, dem Stand jedes einzelnen Punktes daraus.

Syntax

Ein Stapel ist eine Folge von durch ; getrennten Anweisungen. DECLARE @x TYPE legt eine Variable an, SET/SELECT @x = ... weist ihr einen Wert zu. Kontrollfluss (IF/WHILE/BEGIN...END), Transaktionen (BEGIN TRANSACTION/COMMIT/ROLLBACK) und Batches ohne GO laufen wie am echten SQL Server.

Eine Tabelle anlegen

CREATE TABLE legt eine dauerhafte Tabelle an; INSERT füllt eine Zeile, SELECT liest sie zurück.

CREATE TABLE Pruefstand_Tabellen (Id int PRIMARY KEY, Name nvarchar(50));
INSERT INTO Pruefstand_Tabellen VALUES (1, 'Erste Zeile');
SELECT Id, Name FROM Pruefstand_Tabellen;
DROP TABLE Pruefstand_Tabellen;
Erwartetes Ergebnis
Id | Name
1 | Erste Zeile

Eine Überweisung als Transaktion

BEGIN TRANSACTION/COMMIT fasst zwei UPDATEs zu einer Einheit zusammen — entweder beide oder keines.

CREATE TABLE Pruefstand_Konto (Id int PRIMARY KEY, Saldo decimal(9,2));
INSERT INTO Pruefstand_Konto VALUES (1, 100.00), (2, 50.00);
BEGIN TRANSACTION;
UPDATE Pruefstand_Konto SET Saldo = Saldo - 30 WHERE Id = 1;
UPDATE Pruefstand_Konto SET Saldo = Saldo + 30 WHERE Id = 2;
COMMIT TRANSACTION;
SELECT Id, Saldo FROM Pruefstand_Konto ORDER BY Id;
DROP TABLE Pruefstand_Konto;
Erwartetes Ergebnis
Id | Saldo
1 | 70.00
2 | 80.00

Datentypen

Jeder Typ von SQL Server 2022/2025 steht: die Ganzzahl- und Dezimaltypen, varchar/nvarchar (auch (max)), date/time/datetime2/datetimeoffset, binary/varbinary, uniqueidentifier, sql_variant, xml samt XQuery, hierarchyid, geometry/geography, jede Sortierung (auch UTF-8), json und vector(n) aus SQL Server 2025. Die vollständige Abdeckungs-Matrix (was in DDL, Ausdruck, Speicher und über TDS trägt) steht in docs/roadmap.md, Abschnitt 5.

Einen Datensatz als JSON bauen und wieder lesen

FOR JSON PATH baut ein JSON-Dokument aus einer Zeile, JSON_VALUE liest einen Wert daraus zurück.

DECLARE @j nvarchar(max) = (SELECT 1 AS Id, 'Anna' AS Name FOR JSON PATH, WITHOUT_ARRAY_WRAPPER);
SELECT JSON_VALUE(@j, '$.Id') AS Id, JSON_VALUE(@j, '$.Name') AS Name;
Erwartetes Ergebnis
Id | Name
1 | Anna

Kosinusabstand zweier Vektoren

vector(n) aus SQL Server 2025: VECTOR_DISTANCE misst, wie unähnlich zwei Vektoren sind — 1.0 heißt orthogonal.

SELECT VECTOR_DISTANCE('cosine', CAST('[1,0]' AS vector(2)), CAST('[0,1]' AS vector(2))) AS Kosinusabstand;
Erwartetes Ergebnis
Kosinusabstand
1

Funktionen

Aggregate (SUM, COUNT, AVG, MIN/MAX, STRING_AGG), Fensterfunktionen (ROW_NUMBER, RANK, LAG/LEAD mit OVER), Zeichenketten (CONCAT, SUBSTRING, TRIM, LPAD/RPAD), JSON (JSON_VALUE, JSON_QUERY, FOR JSON PATH, OPENJSON), Vektoren (VECTOR_DISTANCE, VECTOR_NORM) und die üblichen Datums-/Mathematikfunktionen.

Kunden mit ihren Bestellungen

JOIN verbindet zwei Tabellen über einen Fremdschlüssel; GROUP BY fasst zusammen.

CREATE TABLE Pruefstand_Kunden (Id int PRIMARY KEY, Name nvarchar(50));
CREATE TABLE Pruefstand_Bestellungen (Id int PRIMARY KEY, KundeId int, Betrag decimal(9,2));
INSERT INTO Pruefstand_Kunden VALUES (1, 'Anna'), (2, 'Beat');
INSERT INTO Pruefstand_Bestellungen VALUES (1, 1, 19.90), (2, 1, 5.00), (3, 2, 42.00);
SELECT k.Name, SUM(b.Betrag) AS Summe
FROM Pruefstand_Kunden k JOIN Pruefstand_Bestellungen b ON b.KundeId = k.Id
GROUP BY k.Name ORDER BY k.Name;
DROP TABLE Pruefstand_Bestellungen;
DROP TABLE Pruefstand_Kunden;
Erwartetes Ergebnis
Name | Summe
Anna | 24.90
Beat | 42.00

Fehlernummern

Dieselben Nummern wie bei SQL Server: 207 unbekannte Spalte, 208 unbekanntes Objekt (Tabelle/Sicht), 2627/2601 Verletzung von PRIMARY KEY/UNIQUE, 3998 eine verdorbene Transaktion am Stapelende. Eine GRANT/DENY-Verletzung meldet sich nicht als Fehlernummer, sondern als verweigerter Zugriff.

Rechte vergeben und verweigern

GRANT gewährt ein Recht, DENY verweigert es ausdrücklich — beides steht danach in sys.database_permissions.

CREATE TABLE Pruefstand_Kunden2 (Id int PRIMARY KEY, Name nvarchar(50));
GRANT SELECT ON Pruefstand_Kunden2 TO PruefstandLeser;
DENY DELETE ON Pruefstand_Kunden2 TO PruefstandLeser;
SELECT permission_name, state_desc FROM sys.database_permissions
WHERE major_id = OBJECT_ID('Pruefstand_Kunden2') ORDER BY permission_name ASC;
DROP TABLE Pruefstand_Kunden2;
Erwartetes Ergebnis
permission_name | state_desc
DELETE | DENY
SELECT | GRANT