{"id":225,"date":"2012-08-20T10:45:00","date_gmt":"2012-08-20T13:45:00","guid":{"rendered":"http:\/\/fx2.com.uy\/site\/20-tips-para-escribir-stored-procedures-en-sql-server\/"},"modified":"2012-08-20T10:45:00","modified_gmt":"2012-08-20T13:45:00","slug":"20-tips-para-escribir-stored-procedures-en-sql-server","status":"publish","type":"post","link":"https:\/\/fx2.com.uy\/es\/blog\/20-tips-para-escribir-stored-procedures-en-sql-server\/","title":{"rendered":"20 tips para escribir stored procedures en SQL Server"},"content":{"rendered":"<p style=\"text-align: justify;\">Esta es una breve lista de recomendaciones b\u00e1sicas que ayudan mucho al momento de trabajar con stored procedures en SQL Server.<\/p>\n<p style=\"text-align: justify;\">Como \u00faltimamente he utilizado mucho <a href=\"http:\/\/www.microsoft.com\/sqlserver\/en\/us\/default.aspx\" target=\"_blank\" rel=\"noopener noreferrer\">SQL Server 2008 R2<\/a> puede haber alguna sugerencia que solo aplique a dicha versi\u00f3n.<\/p>\n<p style=\"text-align: justify;\">1)\u00a0Para facilitar la lectura utilice una identaci\u00f3n adecuada.<\/p>\n<p style=\"text-align: justify;\">2)\u00a0Agregue comentarios en la l\u00f3gica compleja y utilice el wizard de creaci\u00f3n de objetos (stored procedures en este caso) para completar los campos sugeridos (autor, fecha de creaci\u00f3n, breve descripci\u00f3n). \u00a0Recuerde utilizar Ctrl+Shift+M para especificar los valores del template.<\/p>\n<p style=\"text-align: justify;\">3)\u00a0Es buena pr\u00e1ctica escribir las palabras reservadas en may\u00fasculas (por ej. SELECT, RTRIM, FROM, DELETE, etc..) porque facilitan mucho la lectura del c\u00f3digo.<\/p>\n<p style=\"text-align: justify;\"><!--more--><\/p>\n<p>4)\u00a0Escriba el nombre del stored procedure de forma correctamente calificada ( por ej. [dbo]. EmployeeSalaryCalc )<\/p>\n<p style=\"text-align: justify;\">5)\u00a0En lo posible siempre declarar e inicializar las variables al comienzo del c\u00f3digo del stored procedure, tratar de usar la cantidad de variables m\u00ednimas necesarias.<\/p>\n<p style=\"text-align: justify;\">6)\u00a0No escriba el nombre del stored procedure comenzando con el prefijo \u201csp_\u201d, 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 \u201cmaster\u201d y luego en las demas.<\/p>\n<p style=\"text-align: justify;\">7)\u00a0Agregue la opci\u00f3n de SET NOCOUNT ON al inicio del procedimiento para evitar el mensaje innecesario de n\u00famero de filas afectadas.<\/p>\n<p style=\"text-align: justify;\">8)\u00a0Utilice tablas temporales solamente cuando es necesario. Los stored procedure suelen utilizar un plan de ejecuci\u00f3n, almacenado en cach\u00e9, para aumentar el rendimiento, cuando se utilizan tablas temporales se requiere hacer la compilaci\u00f3n en cada ejecuci\u00f3n y no se puede aprovechar el plan de ejecuci\u00f3n.<\/p>\n<p style=\"text-align: justify;\">9)\u00a0Trate de devolver siempre las columnas necesarias, es muy recomendable evitar sentencias del tipo \u201cSELECT * FROM\u201d.<\/p>\n<p style=\"text-align: justify;\">10)\u00a0Utilice cursores solo cuando es necesario. Los cursores requieren m\u00e1s memoria y por tanto se degrada el rendimiento del stored procedure. En algunos casos se puede utilizar la variable de tabla y el bucle \u00a0WHILE para iterar sobre un el conjunto de resultados.<\/p>\n<p style=\"text-align: justify;\">11)\u00a0Es buena pr\u00e1ctica asignar el valor por defecto para cada par\u00e1metro y siempre establecer el tama\u00f1o 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\u00f3n del tipo &#8220;error de cadena truncada&#8221; si se est\u00e1 frente a un INSERT o UPDATE de dicho campo.<\/p>\n<p style=\"text-align: justify;\">12)\u00a0Utilice la sentencia Try para capturar adecuadamente los errores en tiempo de ejecuci\u00f3n dentro del stored procedure y hacer un manejo acorde en dicha situaci\u00f3n.<\/p>\n<p style=\"text-align: justify;\">13)\u00a0Ante consultas complejas y que se utilizan en varias ocasiones, tenga en cuenta crear vistas para un manejo m\u00e1s adecuado.<\/p>\n<p style=\"text-align: justify;\">14)\u00a0Evite utilizar sub-consultas (SELECT A.column1 FROM (SELECT data1 FROM) as A \u2026), utilice la sentencia INNER JOIN siempre que sea posible.<\/p>\n<p style=\"text-align: justify;\">15)\u00a0Trate de evitar la condici\u00f3n de filtrado en la cl\u00e1usula WHERE si puede ser escrito al momento de utilizar la sentencia de JOIN.<\/p>\n<p style=\"text-align: justify;\">16)\u00a0Utilice la sentencia SELECT TOP 1 para la comprobaci\u00f3n\/obtenci\u00f3n de un dato en base a una condici\u00f3n.<\/p>\n<p>Ej. en lugar de : SELECT @ name = nombre FROM Empleados WHERE nombre LIKE &#8216;%Rob%&#8217;<\/p>\n<p>Si se devuelven m\u00faltiples registros ocasiona un error en momento de ejecuci\u00f3n.<\/p>\n<p>SELECT TOP 1 @ name = nombre FROM Empleados WHERE nombre LIKE &#8216;%Rob%&#8217;<\/p>\n<p style=\"text-align: justify;\">17)\u00a0En los caso donde se puede aplicar una instrucci\u00f3n CASE es mejor que el anidamiento de sentencias IF-ELSE.<\/p>\n<p style=\"text-align: justify;\">18)\u00a0Consultas Din\u00e1micas: trate de reducir al m\u00ednimo el uso de las consultas din\u00e1micas.<\/p>\n<p style=\"text-align: justify;\">Si est\u00e1 utilizando una consulta din\u00e1mica similar a \u201cSELECT * FROM mydb.dbo.emp WHERE empid = @ EmpId\u201d, entonces no hay problema. En este caso se proporciona un valor para el par\u00e1metro @EmpId y el motor no tiene que generar o recargar un nuevo plan de ejecuci\u00f3n. En cambio si se utiliza una consulta del tipo @query = \u201cSELECT * FROM emp donde empid =\u201d + @ EmpId esto por defecto \u00a0no admite un plan de ejecuci\u00f3n predeterminado y cargado en el motor de base de datos.<\/p>\n<p style=\"text-align: justify;\">19)\u00a0Utilice las instrucciones ORDER BY y DISTINCT solo cuando se requieran. Caso contrario el motor de SQL Server obtendr\u00e1 el primer resultado y lo har\u00e1 de nuevo si requiere utilizar algunas de estas instrucciones.<\/p>\n<p style=\"text-align: justify;\">20)\u00a0Utilice los \u00edndices correctos en las columnas de cada tabla. No es buena pr\u00e1ctica crear \u00edndices en las columnas que no se utilizan en las cl\u00e1usulas WHERE. Cuando se crean \u00edndices extras se puede requerir un ida y vuelta extra del motor de base de datos para consultar el resultado.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esta es una breve lista de recomendaciones b\u00e1sicas que ayudan mucho al momento de trabajar con stored procedures en SQL Server. Como \u00faltimamente he utilizado mucho SQL Server 2008 R2 puede haber alguna sugerencia que solo aplique a dicha versi\u00f3n. 1)\u00a0Para facilitar la lectura utilice una identaci\u00f3n adecuada. 2)\u00a0Agregue comentarios en la l\u00f3gica compleja y [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[96],"tags":[97],"_links":{"self":[{"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/posts\/225"}],"collection":[{"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/comments?post=225"}],"version-history":[{"count":0,"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/posts\/225\/revisions"}],"wp:attachment":[{"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/media?parent=225"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/categories?post=225"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/tags?post=225"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}