📖 Zašto JSON u SQL Serveru?
U modernom razvoju, aplikacije komuniciraju putem JSON-a. Ranije ste morali parsirati JSON u aplikativnom kodu (npr. C# ili JavaScript) prije slanja u bazu. SQL Server 2022 omogućava da cijeli JSON objekt pošaljete u bazu i tamo ga pasirate, pretvorite u tabelu ili generišete novi JSON iz query rezultata.
📦 Skladištenje JSON-a
Za razliku od XML-a koji ima poseban tip (XML), JSON se u SQL Serveru čuva u običnim
tekstualnim kolonama: NVARCHAR(MAX) ili NVARCHAR(4000).
🧠 Zašto ne postoji "JSON" tip?
Microsoft je odlučio koristiti NVARCHAR jer je JSON po definiciji tekst. To omogućava
da svi postojeći alati, drajveri i aplikacije mogu raditi sa JSON-om bez ikakvih nadogradnji.
Performanse parsiranja su optimizovane kroz interne binarne funkcije.
🔍 Parsiranje JSON-a
1. JSON_VALUE: Hvatanje skalara
Koristimo ga kada želimo izvući jednu vrijednost (string, broj, bool).
DECLARE @json NVARCHAR(MAX) = '{"FirstName": "John", "Age": 30, "Skills": ["SQL", "Azure"]}';
SELECT
JSON_VALUE(@json, '$.FirstName') AS FirstName,
JSON_VALUE(@json, '$.Age') AS Age;
2. OPENJSON: Pretvaranje JSON-a u Tabelu
Ovo je najmoćnija funkcija. Ona prima JSON i vraća ga kao set redova i kolona.
DECLARE @json NVARCHAR(MAX) = '[
{"Product": "Laptop", "Price": 1200},
{"Product": "Mouse", "Price": 25}
]';
SELECT * FROM OPENJSON(@json)
WITH (
ProductName NVARCHAR(50) '$.Product',
ItemPrice DECIMAL(18,2) '$.Price'
);
🏗️ Generisanje JSON-a
Možete pretvoriti bilo koji SQL rezultat u JSON dodavanjem FOR JSON klauzule na kraj upita.
- FOR JSON PATH: Omogućava vam potpunu kontrolu nad strukturom (npr.
'Adresa.Ulica'će napraviti ugniježđeni objekt). - FOR JSON AUTO: SQL Server sam odlučuje o strukturi na osnovu JOIN-ova.
SELECT TOP 2
EmployeeID AS [Info.ID],
FirstName + ' ' + LastName AS [Info.Name],
Email AS [Contact.Email],
Position AS [Info.Position]
FROM Stats.Employees
FOR JSON PATH, ROOT('Employees');
⚡ Performanse i Indeksiranje
Pošto je JSON unutar NVARCHAR kolone, standardni indeks neće raditi na poljima UNUTAR
JSON-a.
Rješenje su Computed Columns (Izračunate kolone).
-- 1. Dodajemo izračunatu kolonu koja izvlači ID iz JSON-a
ALTER TABLE Logs
ADD UserID AS CAST(JSON_VALUE(JsonDoc, '$.user.id') AS INT) PERSISTED;
-- 2. Kreiramo indeks nad tom kolonom
CREATE INDEX IX_Logs_UserID ON Logs(UserID);
-- Sada su upiti nad UserID unutar JSON-a trenutni!
🎯 Praktična Vježba: API Endpoint Simulacija
Zadatak: Primanje i procesiranje Logova
Vaš API šalje listu grešaka u bazu kao jedan veliki JSON string.
Morate spasiti samo "Error" poruke u stalnu tabelu StandardLogs.
Input JSON:
'[{"type":"Error", "msg":"Disk Full"}, {"type":"Info", "msg":"Login Success"}]'
DECLARE @incomingJson NVARCHAR(MAX) = '[{"type":"Error", "msg":"Disk Full"}, {"type":"Info", "msg":"Login Success"}]';
INSERT INTO StandardLogs (Message, LogDate)
SELECT msg, GETDATE()
FROM OPENJSON(@incomingJson)
WITH (
type NVARCHAR(20) '$.type',
msg NVARCHAR(MAX) '$.msg'
)
WHERE type = 'Error';
GO
✅ Zaključak Modula 2
Završili smo drugi modul. Sada vladate modernim T-SQL-om:
- ✅ Možete miješati JSON i Relacijske podatke bez gubitka performansi.
- ✅ Znate pretvoriti bilo koji SQL upit u format spreman za Web API.
- ✅ Razumijete kako indeksirati "nevidljiva" polja unutar teksta.
📚 Modul 3: Programabilnost
U sljedećem modulu prelazimo na pisanje logike u bazi. Naučićete kako pisati Procedure, Funkcije i Trigere koji su otporni na greške.