MODUL 2 - LEKCIJA 5

Integracija JSON Podataka

Premošćivanje jaza između NoSQL fleksibilnosti i Relacijske snage

⏱️ Trajanje: ~3 časa 📚 Nivo: Srednji do Napredni 🎯 Praktični primjeri: 6

📖 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).

⚡ Izvlačenje pojedinačnih polja
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.

🛠️ JSON to Table
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.

💎 Export u JSON
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).

🚀 Indeksiranje JSON polja
-- 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"}]'

💡 Rješenje
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:

📚 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.