Programma
T-SQL (Transact-SQL) è l’estensione di Microsoft dello standard SQL, progettata specificamente per l’uso con Microsoft SQL Server. Pur includendo tutte le funzionalità principali di SQL per interrogare e gestire i dati, T-SQL aggiunge caratteristiche di programmazione procedurale che ti permettono di scrivere logiche di database più potenti e dinamiche.
In questa guida ti mostrerò come funziona T-SQL e come usarlo in modo efficace in scenari reali. Tratterò anche i casi d’uso più comuni, come interrogare database, scrivere stored procedure e automatizzare flussi di lavoro di routine, con esempi pratici.
Se sei alle prime armi con SQL, inizia dal nostro corso Introduzione a SQL, oppure il corso SQL intermedio se hai già un po’ di esperienza. Inoltre, trovo che la Cheat Sheet SQL Basics, che puoi scaricare, sia un utile riferimento perché contiene tutte le funzioni SQL più comuni.
Che cos’è T-SQL e in cosa differisce da SQL
Per capire meglio T-SQL, pensa a SQL come a una lingua universale e a T-SQL come a un dialetto professionale specializzato.
SQL (Structured Query Language) è il linguaggio standard usato per interagire con database relazionali. È dichiarativo, il che significa che specifichi quale risultato vuoi ottenere, come selezionare o filtrare i dati, e il motore del database decide come eseguire la query.
T-SQL, invece, è l’estensione di SQL di Microsoft usata in Microsoft SQL Server. Si basa su SQL standard aggiungendo capacità di programmazione procedurale, permettendoti di controllare come le operazioni vengono eseguite passo dopo passo.
Da questa definizione, T-SQL introduce diverse funzionalità potenti che vanno oltre le semplici query, tra cui:
-
Variabili: puoi usare le parole chiave
DECLAREeSETper memorizzare dati in memoria e riutilizzarli negli script -
Flusso di controllo: puoi usare logiche come
IF,WHILEeBEGIN...ENDper controllare l’esecuzione e decidere quale codice far girare. -
Gestione degli errori: T-SQL introduce i blocchi
TRY...CATCH, che permettono al database di intercettare un errore e gestirlo in modo elegante senza interrompere l’intera operazione. -
Stored procedure: puoi creare blocchi di logica riutilizzabili che vengono eseguiti all’interno del database.
Se ti capita di lavorare con SQL Server, sappi che DataCamp ha molte ottime risorse per aiutarti. Per iniziare, ti consiglio il corso Introduzione a SQL Server di DataCamp per padroneggiare le basi di SQL Server per l’analisi dei dati.
Sintassi e struttura di base di T-SQL
T-SQL usa la stessa sintassi di base di SQL standard, quindi se conosci già SQL ti risulterà facile da capire. In questa sezione ti guiderò tra le istruzioni più comuni di T-SQL con esempi semplici e pratici.
SELECT, INSERT, UPDATE, DELETE
Questi comandi sono standard nella maggior parte dei dialetti SQL, incluso Microsoft SQL Server, per cui è stato creato T-SQL.
SELECT
Il comando usato per recuperare dati da tabelle specifiche. Per esempio, la query seguente recupera FirstName e LastName dalla tabella Customers.
-- Retrieve data from the Customers table
SELECT FirstName, LastName
FROM Customers
WHERE Country = ‘USA’; -- Filters rows to only customers in the USA
INSERT
Questo comando viene usato per inserire nuovi dati nella tabella. La query seguente inserisce una nuova riga nella tabella customers.
-- Insert a new row into a table
INSERT INTO customers (FirstName, city)
VALUES (‘Alice’, ‘Nairobi’);
UPDATE
Questo comando viene usato per modificare dati esistenti nel database. Per esempio, la query seguente cambia il nome della città in “Mombasa” per l’utente “Alice”.
-- Update existing data
UPDATE customers
SET city = ‘Mombasa’
WHERE FirstName= ‘Alice’; -- Always use WHERE to avoid updating all rows
DELETE
Questo comando rimuove dati dal database. Per esempio, la query seguente rimuove la riga in cui FirstName è “Alice”.
-- Delete data from a table
DELETE FROM customers
WHERE FirstName= ‘Alice’; -- Filters which rows to remove
Ti consiglio di provare lo skill track Fondamenti di SQL Server per saperne di più su come riassumere e analizzare i dati usando le funzioni di SQL Server
Esecuzione a batch
Una caratteristica unica di T-SQL è il modo in cui esegue il codice a batch. Un batch è un gruppo di una o più istruzioni SQL inviate a SQL Server come un’unica unità.
La parola chiave GO viene usata per separare i batch:
-- First batch
SELECT * FROM Customers;
GO
-- Second batch (executed separately)
SELECT * FROM Orders;
GO
È importante notare che:
-
GOnon è un comando T-SQL, ma è riconosciuto da strumenti come SQL Server Management Studio. -
Segnala la fine di un batch e l’inizio di un altro.
-
Le variabili non persistono tra un batch e l’altro. Gli oggetti temporanei invece persistono tra batch nella stessa sessione.
Commenti e formattazione
Puoi usare i commenti in T-SQL per rendere il tuo codice SQL più leggibile e manutenibile. Puoi usare commenti su singola riga o multi-riga come mostrato sotto:
-- This query retrieves all customers
SELECT * FROM Customers;
/* This query retrieves customers
from the USA and Canada */
SELECT *
FROM Customers
WHERE Country IN ('USA', 'Canada');
Variabili e tipi di dato in T-SQL
T-SQL ti permette di memorizzare valori in variabili e usarli nelle query, rendendo i tuoi script più flessibili e dinamici. Vediamo come creare queste variabili.
Dichiarare variabili
Per creare una variabile, usi la parola chiave DECLARE. Per convenzione, tutti i nomi di variabili T-SQL devono iniziare con il simbolo @.
-- Declares a variable to store text
DECLARE @CustomerName VARCHAR(50);
Assegnare valori
Puoi assegnare valori usando SET (consigliato per singoli valori) oppure SELECT (utile quando si recupera da una tabella).
-- Assign using SET
SET @CustomerName = 'Alice';
-- Assign using SELECT
SELECT @Age = 30;
Per esempio, la query seguente restituisce un elenco di clienti che vivono a Londra, usando una variabile invece di scrivere il valore nel codice.
-- Assign the variable city
DECLARE @City VARCHAR(50);
SET @City = 'London';
-- Use the variable in a query
SELECT name, city
FROM customers
WHERE city = @City; -- Filters results based on variable value
Tipi di dato comuni
Di seguito alcuni tipi di dato T-SQL comunemente usati che sono standard tra i tipi di dato SQL:
-
INT: Numeri interi, ad esempio 1, 100. -
VARCHAR(n): Testo a lunghezza variabile, come nomi ed email. -
DATETIME: Valori di data e ora -
DECIMAL(p, s): Numeri a precisione fissa, come valute.
Flusso di controllo in T-SQL (IF, WHILE, BEGIN...END)
Uno dei vantaggi di T-SQL è che ti permette di aggiungere logica di programmazione alle tue query. Invece di limitarti a recuperare dati, puoi controllare come e quando il codice viene eseguito. Di seguito alcuni esempi di logica di flusso di controllo.
IF...ELSE (Esecuzione condizionale)
L’istruzione IF ti permette di eseguire un blocco di codice solo se è soddisfatta una specifica condizione. Se la condizione è falsa, puoi usare ELSE per prevedere un’azione alternativa.
Per esempio, la query seguente conta il numero totale di ordini, poi stampa “High order volume” se supera 100 ordini oppure stampa “Low order volume” quando è inferiore a 100.
DECLARE @TotalOrders INT;
SELECT @TotalOrders = COUNT(*)
FROM Orders; -- Count total number of orders
IF @TotalOrders > 100
BEGIN
PRINT 'High order volume'; -- Runs if condition is true
END
ELSE
BEGIN
PRINT 'Low order volume'; -- Runs if condition is false
END
Cicli WHILE (Logica iterativa)
Il ciclo WHILE ripete un blocco di codice finché una condizione rimane vera. È utile per attività che devono avvenire a “blocchi” o per generare dati di test.
La query seguente inizializza un contatore a 1 e usa un ciclo per stampare il numero corrente e incrementarlo di 1 fino ad arrivare a 5.
DECLARE @Counter INT = 1;
WHILE @Counter <= 5
BEGIN
PRINT @Counter; -- Prints numbers from 1 to 5
SET @Counter = @Counter + 1; -- Increment counter
END
BEGIN...END (Raggruppare istruzioni)
Il flusso BEGIN...END viene usato per raggruppare più istruzioni in un unico blocco per garantire che tutto il codice raggruppato venga eseguito insieme in modo atomico.
Per esempio, la query seguente stamperà sia “Customers found in USA” che “Proceeding with operation.” Senza BEGIN...END, verrebbe eseguita solo la prima istruzione dopo IF.
IF EXISTS (SELECT 1 FROM Customers WHERE Country = 'USA')
BEGIN
PRINT 'Customers found in USA';
PRINT 'Proceeding with operation'; -- Both statements run together
END
Quando è utile il flusso di controllo?
Il flusso di controllo in T-SQL è comunemente usato per:
- Automazione: eseguire script pianificati o attività di manutenzione
- Validazione dei dati: controllare condizioni prima di inserire o aggiornare i dati
- Elaborazione a batch: gestire i dati a step o in cicli
- Business logic: applicare regole direttamente nel database
Stored procedure in T-SQL
Una stored procedure è una raccolta salvata di istruzioni T-SQL che puoi riutilizzare all’infinito. Invece di inviare ogni volta un enorme blocco di codice dalla tua applicazione al server, salvi il codice sul server e richiami solo il suo nome.
Le stored procedure sono utili perché puoi riutilizzarle molte volte. I piani di esecuzione precompilati migliorano l’efficienza e nascondono la logica complessa dietro un’interfaccia semplice.
Per esempio, questa stored procedure recupera nome e cognome di un cliente in base all’ID che fornisci.
-- Create a stored procedure named GetCustomerByID
CREATE PROCEDURE GetCustomerByID
@CustomerID INT -- Input parameter to pass a customer ID
AS
BEGIN
-- Select the first and last name of a customer
SELECT FirstName, LastName
FROM Customers
WHERE CustomerID = @CustomerID; -- Filter to match the given ID
END;
Puoi poi eseguire la stored procedure con la query seguente:
-- Calls the procedure
EXEC GetCustomerByID @CustomerID = 1; Funzioni in T-SQL
T-SQL include sia funzioni incorporate sia funzioni definite dall’utente (UDF) utilizzate per trasformare i dati.
Funzioni incorporate
Queste funzioni sono già disponibili in SQL Server e possono essere usate direttamente nelle query.
Funzione per stringhe
È una funzione che trasforma tipi di dato stringa. Per esempio, la query seguente recupera tutti i nomi dalla tabella Customers e li converte in maiuscolo.
-- Converts text to uppercase
SELECT UPPER(FirstName)
FROM Customers;
Funzione per date
Questa funzione trasforma le date. La query seguente restituisce la data e l’ora correnti del sistema.
-- Returns current date and time
SELECT GETDATE();
Funzione di aggregazione
Sono funzioni usate per aggregare valori in una tabella. Per esempio, la query seguente conta il numero totale di righe (clienti) nella tabella Customers.
-- Counts rows
SELECT COUNT(*) AS TotalCustomers
FROM Customers;
Funzioni definite dall’utente (UDF)
Puoi anche creare funzioni personalizzate per riutilizzare la logica in più query.
Funzione scalare
Una funzione scalare restituisce un singolo valore ed è utile quando ti serve un valore calcolato singolo, ad esempio per formattazioni o calcoli. Nella query seguente, la funzione prende come input nome e cognome e li restituisce come un unico nome completo.
-- Create a function that combines the first and last name
CREATE FUNCTION GetFullName
(@FirstName VARCHAR(50), @LastName VARCHAR(50))
RETURNS VARCHAR(100)
AS
BEGIN
RETURN @FirstName + ' ' + @LastName; -- Concatenates the two values
END;
Funzioni che restituiscono tabelle
Le funzioni che restituiscono tabelle ritornano una tabella. Per esempio, la funzione seguente restituisce una tabella di tutti i clienti che appartengono al paese specificato.
-- Create a table-valued function named GetCustomersByCountry
CREATE FUNCTION GetCustomersByCountry (@Country VARCHAR(50))
RETURNS TABLE -- Specifies that the function returns a table
AS
RETURN
(
-- Select all columns from the Customers table
SELECT *
FROM Customers
WHERE Country = @Country -- Filter rows by the given country
);
Ti consiglio di provare il nostro intero career track SQL Server Developer, che non solo ti fornirà le competenze per creare, aggiornare ed eseguire stored procedure, ma ti aiuterà anche con funzioni di aggregazione, join, inserimento e cancellazione di tabelle, e molto altro.
Gestione degli errori in T-SQL
T-SQL usa i blocchi TRY...CATCH per gestire gli errori senza interrompere l’intero script. Questo è importante perché evita arresti imprevisti degli script e ti permette di restituire messaggi significativi per il debug o il logging.
Per esempio, la query seguente prova a eseguire un calcolo che causa un errore, lo intercetta e stampa un messaggio di errore leggibile invece di andare in crash.
BEGIN TRY
-- Attempt to run this code
SELECT 1 / 0; -- This causes a divide-by-zero error
END TRY
BEGIN CATCH
-- Runs if an error occurs in the TRY block
PRINT 'An error occurred: ' + ERROR_MESSAGE(); -- Displays the error message
END CATCH;
Transazioni in T-SQL
Una transazione garantisce che un gruppo di operazioni riesca tutto oppure fallisca tutto. Questo segue il principio ACID, che assicura che il tuo database rimanga coerente anche se salta la corrente durante un aggiornamento.
Nell’esempio seguente, la transazione trasferisce denaro da un conto a un altro e salva entrambe le modifiche insieme.
BEGIN TRANSACTION; -- Start the transaction
-- Deduct money from Account 1
UPDATE Accounts
SET Balance = Balance - 100
WHERE AccountID = 1;
-- Add money to Account 2
UPDATE Accounts
SET Balance = Balance + 100
WHERE AccountID = 2;
COMMIT; -- Save all changes permanently
Se qualcosa va storto, puoi usare la funzione ROLLBACK per annullare la transazione e ripristinare i dati allo stato precedente.
-- Undo all changes made in the current transaction
ROLLBACK;
Le transazioni in T-SQL sono importanti perché assicurano l’integrità dei dati, soprattutto in sistemi critici come le applicazioni finanziarie, dove aggiornamenti parziali potrebbero causare incoerenze.
Puoi provare il nostro career track Transazioni e gestione degli errori in SQL Server, che copre transazioni e gestione degli errori in SQL Server.
Funzionalità T-SQL comuni per l’analisi dei dati
T-SQL include alcuni strumenti particolarmente utili per i professionisti dei dati. Vediamo alcuni esempi e come applicarli nell’analisi dei dati.
Funzioni finestra
Le funzioni finestra eseguono calcoli su righe senza raggrupparle in un unico risultato. Sono usate soprattutto per ranking, totalizzatori progressivi e analisi avanzate.
Nell’esempio seguente, la query assegna un numero di riga univoco a ciascun cliente in base al suo CustomerID.
-- Assigns row numbers to customers
SELECT
FirstName,
ROW_NUMBER() OVER (ORDER BY CustomerID) AS RowNum -- Assigns row numbers
FROM Customers;
Nella query:
-
ROW_NUMBER(): assegna numeri di riga univoci
-
RANK(): assegna ranghi con salti in caso di pari merito -
OVER(): definisce la finestra (ordinamento/partizionamento)
Ti consiglio di dare un’occhiata alla nostra SQL Window Functions Cheat Sheet, che puoi scaricare, dove avrai una comoda guida di riferimento ai vari tipi di funzioni finestra in SQL. Inoltre, dai un’occhiata al nostro corso SQL Server intermedio per saperne di più sull’uso di T-SQL nell’analisi dei dati, incluse le funzioni finestra per riassumere i dati.
Common table expression (CTE)
Le CTE (Common Table Expressions) creano un set di risultati temporaneo che puoi riutilizzare all’interno di una query. La query seguente crea un elenco temporaneo di clienti USA e poi ne recupera i dati.
-- Define a CTE
WITH CustomerCTE AS (
SELECT FirstName, Country
FROM Customers
WHERE Country = 'USA' -- Filter only USA customers
)
-- Query the CTE
SELECT *
FROM CustomerCTE;
Le CTE ricorsive, invece, sono un tipo particolare di CTE che si riferiscono a se stesse nella loro definizione, permettendo alla query di eseguire operazioni ripetute. Questo le rende ideali per lavorare con dati gerarchici come organigrammi.
Ti consiglio il corso Query gerarchiche e ricorsive in SQL Server per imparare a scrivere query avanzate in SQL Server, incluse CTE e CTE ricorsive, con esempi pratici.
Tabelle temporanee
Le tabelle temporanee memorizzano dati per uso a breve termine durante una sessione. Sono utili per staging dei dati, semplificare trasformazioni in più step o migliorare le prestazioni in query complesse.
Per mostrare come funzionano le tabelle temporanee in T-SQL, considera i tre blocchi di query seguenti. Il primo crea una tabella temporanea, poi la riempie con dati dei clienti e quindi la interroga nella stessa sessione.
-- Create a temporary table
CREATE TABLE #TempCustomers (
FirstName VARCHAR(50),
Country VARCHAR(50)
);
-- Insert data into the temporary table
INSERT INTO #TempCustomers
SELECT FirstName, Country
FROM Customers;
-- Retrieve data from the temporary table
SELECT * FROM #TempCustomers;
È importante notare che le tabelle temporanee sono prefissate con # e vengono eliminate automaticamente alla fine della sessione.
T-SQL vs. altri dialetti SQL
Tutti i dialetti SQL condividono le stesse basi, ma ogni sistema di database aggiunge la propria sintassi e le proprie funzionalità. T-SQL è progettato specificamente per Microsoft SQL Server, il che influenza come funziona e dove dà il meglio.
T-SQL vs. PostgreSQL (PL/pgSQL)
PostgreSQL usa PL/pgSQL per la logica procedurale, simile a T-SQL ma con sintassi e punti di forza diversi. La tabella seguente riassume queste differenze:
|
Categoria |
T-SQL (SQL Server) |
PostgreSQL (PL/pgSQL) |
|
Linguaggio procedurale |
Integrato in T-SQL |
Usa PL/pgSQL |
|
Sintassi delle variabili |
|
|
|
Denominazione variabili |
Usa prefisso |
Nessun prefisso (ad esempio, |
|
Struttura dei blocchi |
Più semplice, spesso implicita o |
Esplicita: richiede |
|
Blocco di esempio |
Batch T-SQL standard |
Racchiuso in |
|
Tipi di dato avanzati |
Limitati |
Supporto nativo avanzato (JSONB, array, geometrici) |
|
Strumenti e integrazione |
Integrazione stretta con gli strumenti di SQL Server |
Flessibile su più piattaforme |
|
Ecosistema |
Ottimizzato per Windows, Azure, SSMS e Power BI |
Open-source, multipiattaforma |
Dai un’occhiata allo skill track SQL per amministratori di database per imparare a progettare database relazionali e strutturare le tue query per migliorare le prestazioni.
T-SQL vs. MySQL
MySQL supporta anch’esso SQL procedurale, ma con un approccio più semplice e limitato. La tabella seguente confronta le differenze di sintassi e funzionalità di questi due dialetti.
|
Categoria |
T-SQL (Microsoft) |
MySQL |
|
Limitazione righe |
|
|
|
Gestione errori |
Robusti blocchi |
Sintassi DECLARE HANDLER più limitata |
|
Logica procedurale |
Ricca, strutturata e altamente programmabile |
Funzionalità procedurali più semplici e limitate |
|
Analitica |
Funzioni finestra e CTE |
Funzionalità analitiche di base (in miglioramento nelle versioni più recenti) |
|
Ecosistema |
Legato a SQL Server e all’Enterprise tooling |
Leggero; cuore dello stack LAMP (Linux, Apache, ecc.) |
|
Ideale per |
Logiche di business complesse e data warehousing |
Applicazioni web e operazioni di lettura ad alta velocità |
Casi d’uso reali di T-SQL
T-SQL è ampiamente usato oltre la semplice interrogazione dei dati. Di seguito alcuni esempi in cui l’ho trovato utile come professionista dei dati.
Query per reportistica
T-SQL è comunemente usato per generare report direttamente dal database. Per esempio, puoi aggregare le vendite per regione o classificare i prodotti con le migliori performance usando funzioni finestra.
Processi ETL (Extract, Transform, Load)
T-SQL è usato nelle pipeline di dati dagli ingegneri dei dati per preparare e spostare i dati. Ad esempio, puoi estrarre dati da tabelle di staging, trasformare i formati, ripulire le incoerenze e caricare nelle tabelle finali per la reportistica.
Script di pulizia dati
Se il tuo database ha milioni di righe con formati di indirizzo incoerenti, puoi usare uno script T-SQL con cicli WHILE o CTE per individuare duplicati, riempire valori mancanti o standardizzare i formati.
Logica backend nelle applicazioni
Molte applicazioni si affidano a T-SQL per gestire la business logic all’interno del database. Puoi usare stored procedure per operazioni CRUD, eseguire validazioni prima dell’inserimento dei dati o usare la gestione delle transazioni per operazioni critiche.
Errori comuni e best practice
Sebbene T-SQL sia utile per interrogazioni avanzate, è probabile imbattersi in alcuni problemi comuni. Di seguito alcuni errori ricorrenti che ho incontrato usando T-SQL:
-
Abusare dei cicli invece della logica basata su set: usare cicli come
WHILEper operazioni riga per riga può rallentare le prestazioni. SQL è progettato per lavorare con insiemi di dati in blocco. -
Scarsa consapevolezza degli indici: non usare correttamente gli indici può rendere le query lente, soprattutto su tabelle grandi.
-
Uso improprio delle transazioni: eseguire più operazioni correlate senza racchiuderle in una transazione può lasciare i dati in uno stato incoerente se qualcosa fallisce a metà.
-
Ignorare la gestione degli errori: se salti i blocchi
TRY...CATCH, il debug diventa più difficile e gli script possono fallire silenziosamente o in modo imprevedibile in produzione.
Di seguito le best practice che consiglio per aiutarti a scrivere query più efficienti e affidabili:
-
Preferisci query basate su set: usa
JOIN,GROUP BYe funzioni finestra invece dei cicli quando possibile. Questo è in linea con il modo in cui SQL Server è progettato per elaborare i dati in modo efficiente. -
Scrivi codice leggibile e manutenibile: usa convenzioni di denominazione chiare, formatta le query in modo coerente e aggiungi commenti dove necessario. Ciò rende il tuo codice leggibile, più facile da fare debug e su cui collaborare.
-
Testa le procedure: testa sempre stored procedure e query con input diversi per assicurarti che funzionino correttamente e gestiscano i casi limite.
Conclusione
T-SQL estende SQL standard aggiungendo capacità di programmazione, rendendolo uno strumento flessibile e potente per automazione, elaborazione e analisi dei dati. Con funzionalità come variabili, stored procedure e gestione degli errori, ti permette di creare soluzioni di database più dinamiche ed efficienti.
Come passo successivo, ti consiglio di provare il nostro Associate Data Analyst in SQL career track per diventare un data analyst competente. Il nostro corso Reporting in SQL ti aiuterà anche a diventare esperto nella creazione di report complessi. Infine, dovresti ottenere la nostra Certificazione SQL Associate per dimostrare la tua padronanza nell’uso di SQL per risolvere problemi di business e distinguerti tra gli altri professionisti.
FAQ su T-SQL
In cosa T-SQL è diverso da SQL standard?
SQL è principalmente dichiarativo, mentre T-SQL combina query dichiarative con programmazione procedurale, permettendoti di controllare come vengono eseguite le operazioni.
Devo imparare SQL prima di imparare T-SQL?
Sì, una conoscenza di base di SQL è importante, poiché T-SQL si basa direttamente su concetti core di SQL come SELECT, INSERT, UPDATE e DELETE.
T-SQL è disponibile in tutti i dialetti SQL?
No, T-SQL è specifico dell’ecosistema Microsoft ed è utilizzato principalmente con Microsoft SQL Server e strumenti correlati come Azure SQL.
Cosa sono le stored procedure e perché sono utili?
Le stored procedure sono blocchi riutilizzabili di codice T-SQL che girano all’interno del database. Aiutano a migliorare le prestazioni, far rispettare la coerenza e semplificare la logica applicativa.
A cosa servono le funzioni finestra in T-SQL?
Le funzioni finestra sono usate per attività di analisi avanzata come ranking, totalizzatori progressivi e confronto di valori tra righe senza raggruppare i dati.


