Esta es una breve lista de recomendaciones b谩sicas que ayudan mucho al momento de trabajar con stored procedures en SQL Server.

Como 煤ltimamente he utilizado mucho SQL Server 2008 R2 puede haber alguna sugerencia que solo aplique a dicha versi贸n.

1)聽Para facilitar la lectura utilice una identaci贸n adecuada.

2)聽Agregue comentarios en la l贸gica compleja y utilice el wizard de creaci贸n de objetos (stored procedures en este caso) para completar los campos sugeridos (autor, fecha de creaci贸n, breve descripci贸n). 聽Recuerde utilizar Ctrl+Shift+M para especificar los valores del template.

3)聽Es buena pr谩ctica escribir las palabras reservadas en may煤sculas (por ej. SELECT, RTRIM, FROM, DELETE, etc..) porque facilitan mucho la lectura del c贸digo.

4)聽Escriba el nombre del stored procedure de forma correctamente calificada ( por ej. [dbo]. EmployeeSalaryCalc )

5)聽En lo posible siempre declarar e inicializar las variables al comienzo del c贸digo del stored procedure, tratar de usar la cantidad de variables m铆nimas necesarias.

6)聽No escriba el nombre del stored procedure comenzando con el prefijo 鈥渟p_鈥, esto es reservado para los sotred procedures de sistema de SQL Server. Cuando se hace la solicitud de un stored procedure que comienza con ese prefijo el motor de base de datos intenta buscar primero en la base de datos 鈥渕aster鈥 y luego en las demas.

7)聽Agregue la opci贸n de SET NOCOUNT ON al inicio del procedimiento para evitar el mensaje innecesario de n煤mero de filas afectadas.

8)聽Utilice tablas temporales solamente cuando es necesario. Los stored procedure suelen utilizar un plan de ejecuci贸n, almacenado en cach茅, para aumentar el rendimiento, cuando se utilizan tablas temporales se requiere hacer la compilaci贸n en cada ejecuci贸n y no se puede aprovechar el plan de ejecuci贸n.

9)聽Trate de devolver siempre las columnas necesarias, es muy recomendable evitar sentencias del tipo 鈥淪ELECT * FROM鈥.

10)聽Utilice cursores solo cuando es necesario. Los cursores requieren m谩s memoria y por tanto se degrada el rendimiento del stored procedure. En algunos casos se puede utilizar la variable de tabla y el bucle 聽WHILE para iterar sobre un el conjunto de resultados.

11)聽Es buena pr谩ctica asignar el valor por defecto para cada par谩metro y siempre establecer el tama帽o correcto de las variables (tanto de retorno como internas). Por ejemplo si en la tabla un campo determinado tiene largo 100 (Username (varchar(100)) y en el procedimiento se utiliza como varchar(200) se puede producir un error en tiempo de ejecuci贸n del tipo “error de cadena truncada” si se est谩 frente a un INSERT o UPDATE de dicho campo.

12)聽Utilice la sentencia Try para capturar adecuadamente los errores en tiempo de ejecuci贸n dentro del stored procedure y hacer un manejo acorde en dicha situaci贸n.

13)聽Ante consultas complejas y que se utilizan en varias ocasiones, tenga en cuenta crear vistas para un manejo m谩s adecuado.

14)聽Evite utilizar sub-consultas (SELECT A.column1 FROM (SELECT data1 FROM) as A 鈥), utilice la sentencia INNER JOIN siempre que sea posible.

15)聽Trate de evitar la condici贸n de filtrado en la cl谩usula WHERE si puede ser escrito al momento de utilizar la sentencia de JOIN.

16)聽Utilice la sentencia SELECT TOP 1 para la comprobaci贸n/obtenci贸n de un dato en base a una condici贸n.

Ej. en lugar de : SELECT @ name = nombre FROM Empleados WHERE nombre LIKE ‘%Rob%’

Si se devuelven m煤ltiples registros ocasiona un error en momento de ejecuci贸n.

SELECT TOP 1 @ name = nombre FROM Empleados WHERE nombre LIKE ‘%Rob%’

17)聽En los caso donde se puede aplicar una instrucci贸n CASE es mejor que el anidamiento de sentencias IF-ELSE.

18)聽Consultas Din谩micas: trate de reducir al m铆nimo el uso de las consultas din谩micas.

Si est谩 utilizando una consulta din谩mica similar a 鈥淪ELECT * FROM mydb.dbo.emp WHERE empid = @ EmpId鈥, entonces no hay problema. En este caso se proporciona un valor para el par谩metro @EmpId y el motor no tiene que generar o recargar un nuevo plan de ejecuci贸n. En cambio si se utiliza una consulta del tipo @query = 鈥淪ELECT * FROM emp donde empid =鈥 + @ EmpId esto por defecto 聽no admite un plan de ejecuci贸n predeterminado y cargado en el motor de base de datos.

19)聽Utilice las instrucciones ORDER BY y DISTINCT solo cuando se requieran. Caso contrario el motor de SQL Server obtendr谩 el primer resultado y lo har谩 de nuevo si requiere utilizar algunas de estas instrucciones.

20)聽Utilice los 铆ndices correctos en las columnas de cada tabla. No es buena pr谩ctica crear 铆ndices en las columnas que no se utilizan en las cl谩usulas WHERE. Cuando se crean 铆ndices extras se puede requerir un ida y vuelta extra del motor de base de datos para consultar el resultado.