SQL Server: Como parametrizar una consulta SQL, How to parameterized SQL query

| domingo, 6 de septiembre de 2015


SQL Server: Como parametrizar una consulta SQL, How to parameterized SQL query

Resulta importante en ocasiones hacer uso de un query dinámico, si tenemos parámetros y deseamos usarlos en el query nos enfrentamos a un inconveniente, como podemos concatenarlos si nuestros parámetros son de tipo Entero, Fecha, cualquier otro diferente de String, porque de ser así tendremos que hacer tantas conversiones explícitas como parámetros diferentes de String tengamos, me lo mostró por cierto un amigo llamado HunchBak, así que parte de los créditos son del él, veamos el siguiente ejemplo:

Primero creemos la siguiente tabla:










Código T-SQL para crearla:

USE TEMPDB
GO

IF OBJECT_ID('Cuenta') is not null
BEGIN
 DROP TABLE Cuenta;
END

CREATE TABLE [dbo].[Cuenta]
(
 [Codigo] int NOT NULL,
 [Descripcion] varchar(20) NOT NULL, 
 [Seccion] int NOT NULL
);

INSERT INTO [dbo].[Cuenta]
VALUES
 (2025912, 'PERFORACION A', 1525),
 (2025913, 'PERFORACION B', 1525),
 (2025922, 'CARGA FRONTAL', 23652),
 (2025923, 'CARGA LATERAL', 23652),
 (2025963, 'CHANCADO', 36523),
 (2025964, 'CHANCADO', 36287),
 (2025965, 'CHANCADO', 36523),
 (2025991, 'RECUPERACION', 365247);

GO

Ahora, hacemos una prueba con el siguiente query con el cuál deseamos conocer todas las Cuentas con la DESCRIPCION "CHANCADO" y que sean de la SECCION "36523" :

DECLARE @Descripcion AS varchar(20);
DECLARE @Seccion smallint;

SET @Descripcion = 'CHANCADO';
SET @Seccion = 36523;

DECLARE @sql nvarchar(MAX);

SET @sql = 
N'SELECT 
 Codigo, Descripcion, Seccion
FROM
 Cuenta
WHERE
 Descripcion = ' + @Descripcion + ' AND
 Seccion = ' + @Seccion;

EXEC sp_executesql @sql;

GO

Al ejecutarla, tenemos la siguiente descripción de error:


--Error de conversión al convertir el valor varchar '*' al tipo de datos int, smallint.
--Conversion failed when converting the varchar value '*' to data type int, smallint.

Esto sucede porque no podemos concatenar un tipo de dato Entero a Cadena, podemos hacer una conversión explícita pero estaríamos haciéndolo para cada juego de parámetros y no es lo correcto, lo mejor en estos casos es parametrizar la consulta de esta manera:

DECLARE @Descripcion AS varchar(20);
DECLARE @Seccion int;

SET @Descripcion = 'CHANCADO';
SET @Seccion = 36523;

DECLARE @sql nvarchar(MAX);

SET @sql = 
'SELECT 
 Codigo, Descripcion, Seccion
FROM
 Cuenta
WHERE
 Descripcion = @Descripcion AND
 Seccion = @Seccion';

EXEC sp_executesql @sql, 
 N'@Descripcion varchar(20), @Seccion int', 
 @Descripcion, 
 @Seccion;

GO


Obtenemos la siguiente salida:

Codigo Descripcion Seccion 2025963 CHANCADO 36523 2025965 CHANCADO 36523

Saludos,

0 comentarios:

Publicar un comentario