programa
T-SQL (Transact-SQL) es la extensión de Microsoft del estándar SQL, diseñada específicamente para Microsoft SQL Server. Aunque incluye todas las capacidades básicas de SQL para consultar y gestionar datos, T-SQL añade funciones de programación procedural que te permiten escribir lógica de base de datos más potente y dinámica.
En esta guía te explico cómo funciona T-SQL y cómo usarlo de forma eficaz en escenarios reales. También repasaré casos de uso comunes como consultar bases de datos, escribir procedimientos almacenados y automatizar flujos de trabajo rutinarios, con ejemplos prácticos.
Si estás empezando con SQL, comienza con nuestro curso de Introducción a SQL o el curso de SQL intermedio si ya tienes algo de experiencia. Además, la chuleta SQL Basics Cheat Sheet, que puedes descargar, es una referencia muy útil porque incluye las funciones de SQL más comunes.
Qué es T-SQL y en qué se diferencia de SQL
Para entender mejor T-SQL, piensa en SQL como un idioma universal y en T-SQL como un dialecto profesional especializado.
SQL (Structured Query Language) es el lenguaje estándar para interactuar con bases de datos relacionales. Es declarativo: especificas qué resultado quieres (por ejemplo, seleccionar o filtrar datos) y el motor de la base de datos decide cómo ejecutar la consulta.
T-SQL, por su parte, es la extensión de SQL de Microsoft usada en Microsoft SQL Server. Amplía el SQL estándar añadiendo capacidades de programación procedural, lo que te permite controlar cómo se llevan a cabo las operaciones paso a paso.
A partir de esta definición, T-SQL introduce varias funciones potentes que van más allá de las consultas básicas, entre ellas:
-
Variables: puedes usar las palabras clave
DECLAREySETpara guardar datos en memoria y reutilizarlos dentro de los scripts -
Control de flujo: puedes usar lógica como
IF,WHILEyBEGIN...ENDpara controlar la ejecución y decidir qué código se ejecuta. -
Gestión de errores: T-SQL incorpora bloques
TRY...CATCH, que permiten capturar un error y gestionarlo sin interrumpir toda la operación. -
Procedimientos almacenados: puedes crear bloques de lógica reutilizables que se ejecutan dentro de la base de datos.
Si trabajas con SQL Server, en DataCamp tienes muchos recursos útiles. Para empezar, te recomiendo el curso Introduction to SQL Server para dominar las bases de SQL Server aplicado al análisis de datos.
Sintaxis y estructura básicas de T-SQL
T-SQL utiliza la misma sintaxis central que SQL estándar, así que si ya conoces SQL, te resultará fácil entenderlo. En esta sección te guío por las sentencias más comunes de T-SQL con ejemplos sencillos y prácticos.
SELECT, INSERT, UPDATE, DELETE
Estas órdenes son estándar en la mayoría de dialectos de SQL, incluido Microsoft SQL Server, para el que se creó T-SQL.
SELECT
La instrucción para recuperar datos de tablas específicas. Por ejemplo, la consulta de abajo obtiene FirstName y LastName de la tabla Customers.
-- Retrieve data from the Customers table
SELECT FirstName, LastName
FROM Customers
WHERE Country = ‘USA’; -- Filters rows to only customers in the USA
INSERT
Esta instrucción inserta nuevos datos en una tabla. La consulta siguiente inserta una nueva fila en la tabla customers.
-- Insert a new row into a table
INSERT INTO customers (FirstName, city)
VALUES (‘Alice’, ‘Nairobi’);
UPDATE
Esta instrucción modifica datos existentes en la base de datos. Por ejemplo, la consulta cambia la ciudad a "Mombasa" para la usuaria "Alice".
-- Update existing data
UPDATE customers
SET city = ‘Mombasa’
WHERE FirstName= ‘Alice’; -- Always use WHERE to avoid updating all rows
DELETE
Esta instrucción elimina datos de la base de datos. Por ejemplo, la consulta de abajo borra la fila donde FirstName es "Alice".
-- Delete data from a table
DELETE FROM customers
WHERE FirstName= ‘Alice’; -- Filters which rows to remove
Te recomiendo probar nuestro itinerario de habilidades SQL Server Fundamentals para aprender más sobre cómo resumir y analizar datos con funciones de SQL Server.
Ejecución por lotes
Una característica propia de T-SQL es cómo ejecuta código en lotes. Un lote es un grupo de una o varias sentencias SQL que se envían a SQL Server como una única unidad.
La palabra clave GO se usa para separar lotes:
-- First batch
SELECT * FROM Customers;
GO
-- Second batch (executed separately)
SELECT * FROM Orders;
GO
Es importante tener en cuenta que:
-
GOno es un comando de T-SQL, pero lo reconocen herramientas como SQL Server Management Studio. -
Señala el final de un lote y el inicio de otro.
-
Las variables no persisten entre lotes. Los objetos temporales sí persisten entre lotes dentro de la misma sesión.
Comentarios y formato
Puedes usar comentarios en T-SQL para que tu código SQL sea más legible y fácil de mantener. Puedes añadir comentarios de una sola línea o multilínea como se muestra a continuación:
-- 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');
Variables y tipos de datos en T-SQL
T-SQL te permite almacenar valores en variables y usarlos en consultas, lo que hace que tus scripts sean más flexibles y dinámicos. Veamos cómo crear estas variables.
Declarar variables
Para crear una variable, usas la palabra clave DECLARE. Por convención, todos los nombres de variables en T-SQL empiezan con el símbolo @.
-- Declares a variable to store text
DECLARE @CustomerName VARCHAR(50);
Asignar valores
Puedes asignar valores con SET (recomendado para valores únicos) o con SELECT (útil al recuperar desde una tabla).
-- Assign using SET
SET @CustomerName = 'Alice';
-- Assign using SELECT
SELECT @Age = 30;
Por ejemplo, la consulta siguiente devuelve una lista de clientes que viven en Londres usando una variable en lugar de escribir el valor a mano.
-- 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
Tipos de datos comunes
Estos son algunos de los tipos de datos más usados en T-SQL, que coinciden con los tipos de datos SQL estándar:
-
INT: números enteros, por ejemplo, 1, 100. -
VARCHAR(n): texto de longitud variable como nombres y correos. -
DATETIME: valores de fecha y hora. -
DECIMAL(p, s): números de precisión fija, como moneda.
Control de flujo en T-SQL (IF, WHILE, BEGIN...END)
Una de las ventajas de T-SQL es que te permite añadir lógica de programación a tus consultas. En lugar de limitarte a recuperar datos, puedes controlar cómo y cuándo se ejecuta el código. A continuación tienes ejemplos de lógica de control de flujo.
IF...ELSE (ejecución condicional)
La sentencia IF permite ejecutar un bloque de código solo si se cumple una condición. Si no se cumple, puedes usar ELSE para ejecutar una acción alternativa.
Por ejemplo, la consulta cuenta el número total de pedidos y luego imprime "High order volume" si es superior a 100 o "Low order volume" si está por debajo de 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
Bucles WHILE (lógica iterativa)
El bucle WHILE repite un bloque de código mientras una condición sea verdadera. Es útil para tareas por "bloques" o para generar datos de prueba.
La consulta inicia un contador en 1 y usa un bucle para imprimir el número actual e incrementarlo en 1 hasta llegar 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 (agrupar sentencias)
El bloque BEGIN...END agrupa varias sentencias en un único bloque para asegurar que todo el código agrupado se ejecute de forma atómica.
Por ejemplo, la consulta imprimirá tanto "Customers found in USA" como "Proceeding with operation". Sin BEGIN...END, solo se ejecutaría la primera sentencia tras el 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
¿Cuándo es útil el control de flujo?
El control de flujo en T-SQL se usa habitualmente para:
- Automatización: ejecutar scripts programados o tareas de mantenimiento
- Validación de datos: comprobar condiciones antes de insertar o actualizar datos
- Procesamiento por lotes: manejar datos en pasos o bucles
- Lógica de negocio: aplicar reglas directamente en la base de datos
Procedimientos almacenados en T-SQL
Un procedimiento almacenado es una colección guardada de sentencias T-SQL que puedes reutilizar tantas veces como necesites. En lugar de enviar siempre desde tu aplicación un bloque grande de código al servidor, guardas el código en el servidor y llamas a su nombre.
Los procedimientos almacenados son útiles porque puedes reutilizarlos muchas veces. Sus planes de ejecución precompilados mejoran la eficiencia y ocultan la lógica compleja tras una interfaz sencilla.
Por ejemplo, este procedimiento almacenado recupera el nombre y los apellidos de un cliente según el ID que proporciones.
-- 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;
Puedes ejecutar el procedimiento almacenado con la consulta siguiente:
-- Calls the procedure
EXEC GetCustomerByID @CustomerID = 1; Obtén una Certificación Top SQL
Funciones en T-SQL
T-SQL incluye tanto funciones integradas como funciones definidas por el usuario (UDF) para transformar datos.
Funciones integradas
Estas funciones ya están disponibles en SQL Server y se pueden usar directamente en las consultas.
Funciones de texto
Transforman tipos de datos de texto. Por ejemplo, la consulta de abajo obtiene todos los nombres de la tabla Customers y los convierte a mayúsculas.
-- Converts text to uppercase
SELECT UPPER(FirstName)
FROM Customers;
Funciones de fecha
Transforman y devuelven valores de fecha. La consulta siguiente devuelve la fecha y hora actuales del sistema.
-- Returns current date and time
SELECT GETDATE();
Funciones de agregación
Sirven para agregar valores de una tabla. Por ejemplo, la consulta cuenta el número total de filas (clientes) en la tabla Customers.
-- Counts rows
SELECT COUNT(*) AS TotalCustomers
FROM Customers;
Funciones definidas por el usuario (UDF)
También puedes crear tus propias funciones para reutilizar lógica en varias consultas.
Funciones escalares
Una función escalar devuelve un único valor y es útil cuando necesitas un valor calculado, como formateos o cálculos. En el ejemplo, la función recibe un nombre y unos apellidos y devuelve el nombre completo en una sola cadena.
-- 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;
Funciones con valor de tabla
Las funciones con valor de tabla devuelven una tabla. Por ejemplo, la función siguiente devuelve una tabla con todos los clientes del país indicado.
-- 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
);
Te recomiendo nuestro itinerario profesional completo SQL Server Developer, que no solo te dará las habilidades para crear, actualizar y ejecutar procedimientos almacenados, sino que también te ayudará con funciones de agregación, joins, inserciones, borrados de tablas y mucho más.
Manejo de errores en T-SQL
T-SQL utiliza bloques TRY...CATCH para gestionar errores sin detener todo el script. Esto es clave para evitar caídas inesperadas y te permite devolver mensajes útiles para depurar o registrar incidentes.
Por ejemplo, la consulta intenta ejecutar un cálculo que provoca un error, lo captura e imprime un mensaje legible en lugar de fallar.
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;
Transacciones en T-SQL
Una transacción garantiza que un conjunto de operaciones se complete íntegramente o no se aplique ninguna. Sigue el principio ACID, que asegura que tu base de datos se mantenga consistente incluso si hay un corte de energía a mitad de una actualización.
En el ejemplo, la transacción transfiere dinero de una cuenta a otra y guarda ambos cambios juntos.
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
Si algo sale mal, puedes usar ROLLBACK para deshacer la transacción y restaurar los datos a su estado anterior.
-- Undo all changes made in the current transaction
ROLLBACK;
Las transacciones en T-SQL son fundamentales para garantizar la integridad de los datos, especialmente en sistemas críticos como aplicaciones financieras, donde las actualizaciones parciales podrían generar inconsistencias.
Puedes probar nuestro curso Transactions and Error Handling in SQL Server, que cubre transacciones y gestión de errores en SQL Server.
Funciones habituales de T-SQL para análisis de datos
T-SQL incluye herramientas especialmente útiles para profesionales de datos. Veamos algunos ejemplos y cómo aplicarlos en análisis.
Funciones de ventana
Las funciones de ventana realizan cálculos entre filas sin agruparlas en un único resultado. Se usan sobre todo para rankings, totales acumulados y analítica avanzada.
En el ejemplo, la consulta asigna un número de fila único a cada cliente según su CustomerID.
-- Assigns row numbers to customers
SELECT
FirstName,
ROW_NUMBER() OVER (ORDER BY CustomerID) AS RowNum -- Assigns row numbers
FROM Customers;
En la consulta:
-
ROW_NUMBER(): asigna números de fila únicos
-
RANK(): asigna rangos con huecos en empates -
OVER(): define la ventana (ordenación/partición)
Te recomiendo nuestra chuleta de funciones de ventana en SQL, que puedes descargar, con una guía rápida de los distintos tipos de funciones de ventana en SQL. Además, echa un vistazo a nuestro curso Intermediate SQL Server para aprender más sobre cómo usar T-SQL en análisis de datos, incluidas las funciones de ventana para resumir información.
Expresiones de tabla comunes (CTE)
Las CTE (Common Table Expressions) crean un conjunto de resultados temporal que puedes reutilizar dentro de una consulta. La consulta siguiente crea una lista temporal de clientes de USA y luego recupera datos de ella.
-- Define a CTE
WITH CustomerCTE AS (
SELECT FirstName, Country
FROM Customers
WHERE Country = 'USA' -- Filter only USA customers
)
-- Query the CTE
SELECT *
FROM CustomerCTE;
Por otro lado, las CTE recursivas son un tipo especial de CTE que se referencian a sí mismas dentro de su definición, lo que permite realizar operaciones repetitivas. Son ideales para trabajar con datos jerárquicos como organigramas.
Te recomiendo el curso Hierarchical and Recursive Queries in SQL Server para aprender a escribir consultas avanzadas en SQL Server, incluidas CTE y CTE recursivas, con ejemplos prácticos.
Tablas temporales
Las tablas temporales almacenan datos para uso a corto plazo durante una sesión. Son útiles para preparar datos, simplificar transformaciones en varios pasos o mejorar el rendimiento en consultas complejas.
Para ver cómo funcionan las tablas temporales en T-SQL, considera estos tres bloques de consulta. El primero crea una tabla temporal, luego la rellena con datos de clientes y después la consulta dentro de la misma sesión.
-- 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;
Ten en cuenta que las tablas temporales llevan el prefijo # y se eliminan automáticamente al finalizar la sesión.
T-SQL frente a otros dialectos de SQL
Todos los dialectos de SQL comparten la misma base, pero cada sistema añade su propia sintaxis y funciones. T-SQL está diseñado específicamente para Microsoft SQL Server, lo que influye en cómo funciona y dónde se aprovecha mejor.
T-SQL vs. PostgreSQL (PL/pgSQL)
PostgreSQL usa PL/pgSQL para lógica procedural, similar a T-SQL pero con sintaxis y puntos fuertes distintos. La tabla siguiente resume estas diferencias:
|
Categoría |
T-SQL (SQL Server) |
PostgreSQL (PL/pgSQL) |
|
Lenguaje procedural |
Integrado en T-SQL |
Usa PL/pgSQL |
|
Sintaxis de variables |
|
|
|
Nombrado de variables |
Usa prefijo |
Sin prefijo (por ejemplo, |
|
Estructura de bloques |
Más simple, a menudo implícita o con |
Explícita: requiere |
|
Bloque de ejemplo |
Lote estándar de T-SQL |
Envuelto en |
|
Tipos de datos avanzados |
Limitados |
Soporte nativo avanzado (JSONB, arrays, geométricos) |
|
Herramientas e integración |
Integración estrecha con herramientas de SQL Server |
Flexible entre plataformas |
|
Ecosistema |
Optimizado para Windows, Azure, SSMS y Power BI |
De código abierto y multiplataforma |
Descubre nuestro itinerario de habilidades SQL for Database Administrators para aprender a diseñar bases de datos relacionales y estructurar tus consultas para mejorar el rendimiento.
T-SQL vs. MySQL
MySQL también admite SQL procedural, pero con un enfoque más sencillo y limitado. La tabla siguiente compara las diferencias de sintaxis y funciones entre ambos dialectos.
|
Categoría |
T-SQL (Microsoft) |
MySQL |
|
Limitación de filas |
|
|
|
Gestión de errores |
Bloques |
Sintaxis DECLARE HANDLER más limitada |
|
Lógica procedural |
Rica, estructurada y muy programable |
Funciones procedurales más simples y limitadas |
|
Analítica |
Funciones de ventana y CTE |
Funciones analíticas básicas (mejorando en versiones recientes) |
|
Ecosistema |
Vinculado a SQL Server y herramientas Enterprise |
Ligero; corazón del stack LAMP (Linux, Apache, etc.) |
|
Ideal para |
Lógica de negocio compleja y data warehousing |
Aplicaciones web y lecturas de alta velocidad |
Casos de uso reales de T-SQL
T-SQL se utiliza ampliamente más allá de la consulta básica de datos. Estos son ejemplos donde me ha resultado especialmente útil como profesional de datos.
Consultas para reporting
T-SQL se usa a menudo para generar informes directamente desde la base de datos. Por ejemplo, puedes agregar ventas por región o clasificar los productos con mejor rendimiento usando funciones de ventana.
Procesos ETL (Extract, Transform, Load)
Los ingenieros de datos usan T-SQL en pipelines para preparar y mover datos. Por ejemplo, puedes extraer datos de tablas de staging, transformar formatos, limpiar inconsistencias y cargarlos en tablas finales de reporting.
Scripts de limpieza de datos
Si tu base de datos tiene millones de filas con direcciones inconsistentes, puedes crear un script en T-SQL con bucles WHILE o CTE para identificar duplicados, rellenar valores faltantes o estandarizar formatos.
Lógica de backend en aplicaciones
Muchas aplicaciones recurren a T-SQL para gestionar la lógica de negocio dentro de la base de datos. Puedes usar procedimientos almacenados para operaciones CRUD, realizar validaciones antes de insertar datos o usar transacciones para operaciones críticas.
Errores comunes y buenas prácticas
Aunque T-SQL es muy útil para consultas avanzadas, es fácil toparse con problemas habituales. Estos son algunos errores que me he encontrado al usar T-SQL:
-
Abusar de los bucles en lugar de lógica basada en conjuntos: usar bucles como
WHILEpara operar fila a fila puede perjudicar el rendimiento. SQL está pensado para trabajar con conjuntos de datos. -
Poca atención a los índices: no usar los índices correctamente puede volver lentas las consultas, sobre todo en tablas grandes.
-
No usar transacciones adecuadamente: ejecutar varias operaciones relacionadas sin encapsularlas en una transacción puede dejar tus datos en estado inconsistente si algo falla a mitad de camino.
-
Ignorar el manejo de errores: si omites los bloques
TRY...CATCH, dificulta la depuración y puede provocar fallos silenciosos o impredecibles en producción.
A continuación, mis buenas prácticas recomendadas para escribir consultas más eficientes y fiables:
-
Prioriza las consultas basadas en conjuntos: usa
JOIN,GROUP BYy funciones de ventana en lugar de bucles siempre que sea posible. Así se alinea con cómo SQL Server procesa los datos de forma eficiente. -
Escribe código legible y mantenible: usa convenciones de nombres claras, formatea las consultas de forma consistente y añade comentarios cuando sea necesario. Tu código será más legible, fácil de depurar y de colaborar.
-
Prueba los procedimientos: prueba siempre los procedimientos almacenados y las consultas con distintos inputs para garantizar que funcionan correctamente y manejan casos límite.
Conclusión
T-SQL amplía el SQL estándar con capacidades de programación, lo que lo convierte en una herramienta flexible y potente para automatización, procesamiento y análisis de datos. Con funciones como variables, procedimientos almacenados y manejo de errores, te permite crear soluciones de base de datos más dinámicas y eficientes.
Como siguiente paso, te recomiendo nuestro itinerario profesional Associate Data Analyst en SQL para convertirte en un analista de datos competente. Nuestro curso Reporting in SQL también te ayudará a crear informes complejos con soltura. Por último, consigue nuestra SQL Associate Certification para demostrar tu dominio de SQL resolviendo problemas de negocio y destacar entre otros profesionales.
Preguntas frecuentes sobre T-SQL
¿En qué se diferencia T-SQL de SQL estándar?
SQL es principalmente declarativo, mientras que T-SQL combina consultas declarativas con programación procedural, permitiéndote controlar cómo se ejecutan las operaciones.
¿Necesito aprender SQL antes de aprender T-SQL?
Sí, es importante tener conocimientos básicos de SQL, ya que T-SQL se construye directamente sobre conceptos básicos como SELECT, INSERT, UPDATE y DELETE.
¿T-SQL está disponible en todos los dialectos de SQL?
No, T-SQL es específico del ecosistema de Microsoft y se usa principalmente con Microsoft SQL Server y herramientas relacionadas como Azure SQL.
¿Qué son los procedimientos almacenados y por qué son útiles?
Los procedimientos almacenados son bloques reutilizables de código T-SQL que se ejecutan dentro de la base de datos. Ayudan a mejorar el rendimiento, imponer consistencia y simplificar la lógica de las aplicaciones.
¿Para qué se usan las funciones de ventana en T-SQL?
Las funciones de ventana se usan para tareas de análisis avanzado como rankings, totales acumulados y comparaciones entre filas sin agrupar los datos.
