¿Cuáles son los pros y los contras del mundo real de ejecutar un comando SQL dinámico en un procedimiento almacenado en SQL Server usando
EXEC (@SQL)
versus
EXEC SP_EXECUTESQL @SQL
?
¿Cuáles son los pros y los contras del mundo real de ejecutar un comando SQL dinámico en un procedimiento almacenado en SQL Server usando
EXEC (@SQL)
versus
EXEC SP_EXECUTESQL @SQL
?
Respuestas:
sp_executesql
es más probable que promueva la reutilización del plan de consultas. Cuando se usa sp_executesql
, los parámetros se identifican explícitamente en la firma de llamada. Este excelente artículo describe este proceso .
La referencia frecuentemente citada para muchos aspectos del SQL dinámico es la lectura obligada de Erland Sommarskog: " La maldición y las bendiciones del SQL dinámico ".
Lo importante de SP_EXECUTESQL es que le permite crear consultas parametrizadas, lo cual es muy bueno si le importa la inyección SQL.
El artículo de Microsoft Using sp_executesql recomienda usar en sp_executesql
lugar de una execute
declaración.
Dado que este procedimiento almacenado admite la sustitución de parámetros , sp_executesql es más versátil que EXECUTE; y debido a que sp_executesql genera planes de ejecución que es más probable que sean reutilizados por SQL Server, sp_executesql es más eficiente que EXECUTE.
Entonces, para llevar: No use execute
declaración . Utilice sp_executesql
.
sp_executesql
que no se puede usar para reemplazar execute
. Quizás debería poner el punto que estoy tratando de enfatizar como: Úselo en sp_executesql
lugar de execute
siempre que sea posible .
Siempre usaría sp_executesql en estos días, todo lo que realmente es es un contenedor para EXEC que maneja parámetros y variables.
Sin embargo, no se olvide de OPTION RECOMPILE cuando ajuste consultas en bases de datos muy grandes, especialmente cuando tenga datos distribuidos en más de una base de datos y utilice una RESTRICCIÓN para limitar los análisis de índices.
A menos que use OPTION RECOMPILE, el servidor SQL intentará crear un plan de ejecución de "talla única" para su consulta, y ejecutará un escaneo de índice completo cada vez que se ejecute.
Esto es mucho menos eficiente que una búsqueda, y significa que potencialmente está escaneando índices completos que están restringidos a rangos que ni siquiera está consultando: @
ejecutar el comando
declare @sql varchar (100)
set @sql ='select * from #td1'
if (@IsMonday+@IsTuesday !='')
begin
set @sql= @sql+' where PickupDay in ('''+@IsMonday+''','''+@IsTuesday+''' )'
end
exec( @sql)
int
en SQL dinámico. Tenga en cuenta que @sql se declara como varchar
onvarchar