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,