Migra lógica de backend de queries inline a Stored Procedures (SQL Server), soportando el patrón de "Múltiples Acciones en un SP".
Este skill transforma el backend para que NO exista SQL hardcodeado en el código TypeScript. Toda la lógica de datos debe vivir en Stored Procedures (SPs) en SQL Server.
El usuario prefiere agrupar lógica relacionada en un solo SP controlado por un parámetro (ej: @Accion, @TipoConsulta).
Estructura Típica SQL:
CREATE OR ALTER PROCEDURE [dbo].[sp_Gestion_Entidad]
@Accion NVARCHAR(50),
@Id INT = NULL,
@Datos JSON = NULL, -- O parámetros individuales
@ParamExtra NVARCHAR(MAX) = NULL
AS
BEGIN
SET NOCOUNT ON;
-- Accion: CREAR
IF @Accion = 'CREAR'
BEGIN
INSERT INTO Entidad ...
SELECT SCOPE_IDENTITY() as Id;
RETURN;
END
-- Accion: LISTAR_ACTIVOS
IF @Accion = 'LISTAR_ACTIVOS'
BEGIN
SELECT * FROM Entidad WHERE Activo = 1;
RETURN;
END
-- Accion: BORRAR
IF @Accion = 'BORRAR'
BEGIN
-- Lógica soft delete o validaciones
UPDATE Entidad SET Activo = 0 WHERE Id = @Id;
RETURN;
END
-- Error si acción no existe
THROW 51000, 'Acción no reconocida en sp_Gestion_Entidad', 1;
END
Al encontrar código con const sql = "SELECT ..." o ejecutarQuery('INSERT ...'):
IF @Accion = '...'.TVP (Table Valued Parameters) o JSON para operaciones en lote (ej: insertar múltiples tareas).BEGIN TRAN ... COMMIT / ROLLBACK) para operaciones de escritura.TRY/CATCH.Genera el script completo para crear/actualizar el SP.
-- Ejemplo de script que debes generar
CREATE TYPE dbo.TVP_Ejemplo AS TABLE (...) -- Si es necesario
GO
CREATE OR ALTER PROCEDURE dbo.sp_Ejemplo ...
AS
...
GO
Reemplaza la llamada inline por ejecutarSP.
Antes:
const sql = `SELECT * FROM Tareas WHERE idUsuario = @id`;
return await this.db.ejecutarQuery(sql, { id });
Después:
return await this.db.ejecutarSP('sp_Gestion_Tareas', {
Accion: 'LISTAR_POR_USUARIO',
IdUsuario: id,
});
OBTENER_PENDIENTES, RESOLVER_BLOQUEO).PascalCase o snake_case para parámetros. Mapea correctamente desde TS.