Princiales diferencias y ventajas : Consultas dinamicas con EXEC vs sp_executeSQL
EXEC vs sp_executeSQL
EXEC vs sp_executeSQL : En la actualidad, cuando programamos,quizas por facilidad o por desconocimiento usamos uno o el otro, pero sin saber claramente sun beneficios o deficiencias, entonces mediante Transact SQL nos deja ejecutar SQL dinamico(construir sentencias SQL dinamicamente para ejecutarlas en la base de datos) mediante dos metodos
- EXEC o EXECUTE:Ejecuta una cadena de comandos o una cadena de caracteres dentro de un lote de Transact-SQL o uno de los siguientes módulos: procedimiento almacenado del sistema, procedimiento almacenado definido por el usuario, procedimiento almacenado CLR, función escalar definida por el usuario o procedimiento almacenado extendido. La instrucción EXECUTE se puede usar para enviar comandos de paso a través a los servidores vinculados. Adicionalmente, el contexto en el que se ejecuta una cadena o un comando se puede establecer de forma explícita. Los metadatos para el conjunto de resultados se pueden definir usando las opciones de WITH RESULT SETS.
- SP_EXECUTESQL: Ejecuta una instrucción o lote Transact-SQL que puede volver a utilizarse muchas veces o uno que se ha generado de forma dinámica. La instrucción o el lote Transact-SQL puede contener parámetros incrustados.
Important
- EXEC es una sentencia SQL
- EXEC no permite planes de ejecución
- EXEC no permite el uso de parametros abriendo la posibilidad ataques de SQL Injections
- EXEC no pueden usar el mecanismo de almacenamiento en caché cuando se crean tablas temporales
- SP_ExecuteSQL es un procedimiento almancenado
- SP_ExecuteSQL admite la sustitución de parámetros
- SP_ExecuteSQL genera planes de ejecución y estadisticas para mejorar el rendimiento de las consultas
- SP_ExecuteSQL no permite SQL Injections
EXECUTE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
--********************************************************************************************** DECLARE @str varchar(max)='' DECLARE @param1 varchar(50) ='' DECLARE @param2 varchar(50) ='' --********************************************************************************************** SET @param1='1' SET @param2='2' SET @str='SELECT * FROM Application.People where PersonID IN ('+@param1+','+@param2+')' EXEC (@str) --********************************************************************************************** SET @param1='3' SET @param2='4' SET @str='SELECT * FROM Application.People WHERE PersonID IN ('+@param1+','+@param2+')' EXEC (@str) --********************************************************************************************** SELECT st.text, * FROM sys.dm_exec_cached_plans cp CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st WHERE st.text like '%SELECT * FROM Application.People%' AND st.text not like '%SELECT st.text%' --********************************************************************************************** |
SP_EXECUTESQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
DBCC freeproccache --********************************************************************************************** DECLARE @param1 INT DECLARE @param2 INT SET @param1=1 SET @param2=2 EXEC sp_executesql N'SELECT * FROM Application.People WHERE PersonID IN (@1,@2)',N'@1 INT, @2 INT' ,@param1, @param2 --********************************************************************************************** SET @param1=3 SET @param2=4 EXEC sp_executesql N'SELECT * FROM Application.People WHERE PersonID IN (@1,@2)',N'@1 INT, @2 INT' ,@param1, @param2 --********************************************************************************************** SELECT st.text, * FROM sys.dm_exec_cached_plans cp CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st WHERE st.text like '%SELECT * FROM Application.People%' AND st.text not like '%SELECT st.text%' --********************************************************************************************** |