Tenemos un viejo proyecto de 10-12 años. Estaba usando SQL2000 que ahora hemos movido a SQL2008.¿El SQL formado dinámicamente en los procedimientos almacenados niega el propósito mismo de los procedimientos almacenados?
Durante esta tarea encontré que los procedimientos almacenados aceptaban parámetros y luego construían la consulta como una cadena y luego usaban EXEC para ejecutar el comando.
CREATE PROCEDURE MyProc
(@TableName varchar(255),
@FirstName varchar(50),
@LastName varchar(50))
AS
-- Create a variable @SQLStatement
DECLARE @SQLStatement varchar(255)
-- Enter the dynamic SQL statement into the
-- variable @SQLStatement
SELECT @SQLStatement = "SELECT * FROM " +
@TableName + "WHERE FirstName = '"
+ @FirstName + "' AND LastName = '"
+ @LastName + "'"
-- Execute the SQL statement
EXEC(@SQLStatement)
Este es un mal enfoque. ¿Esto elimina los beneficios del procedimiento almacenado (beneficio de consulta precompilado)?
Si el único propósito del procedimiento es hacer una selección de esa manera, entonces sí, parece una mala idea, pero solo porque es un diseño deficiente, no por razones de rendimiento. – JNK
+1 la pregunta, entiendo que esto es solo un ejemplo, la pregunta es, en general, ¿esto mata los beneficios del procedimiento almacenado? digamos en un sproc más complejo. –
sí, el SP es solo un ejemplo simple, pero el que me preocupa es realmente grande y feo ... tienen patrones como los siguientes, por ejemplo, formando una declaración de selección intermedia y rellenando la tabla temporal entre la ejecución de la selección final en ella para paginación ... y cosas –