{"id":314,"date":"2017-09-19T23:50:04","date_gmt":"2017-09-19T23:50:04","guid":{"rendered":"http:\/\/www.manualsqlserver.com\/?p=314"},"modified":"2020-07-17T15:58:08","modified_gmt":"2020-07-17T15:58:08","slug":"procedimientos-almacenados","status":"publish","type":"post","link":"https:\/\/manualsqlserver.com\/?p=314","title":{"rendered":"Procedimientos Almacenados SQL Server"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"322\" height=\"277\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2017\/09\/ManualSQL_ProcedimientosAlmacenados__D.png\" alt=\"\" class=\"wp-image-936\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2017\/09\/ManualSQL_ProcedimientosAlmacenados__D.png 322w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2017\/09\/ManualSQL_ProcedimientosAlmacenados__D-300x258.png 300w\" sizes=\"auto, (max-width: 322px) 100vw, 322px\" \/><\/figure>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<h2 class=\"wp-block-heading\"><strong>Procedimientos Almacenados&nbsp;<\/strong><\/h2>\n\n\n\n<p>Un procedimiento almacenado son instrucciones T-SQL almacenadas con un nombre en la base de datos.<\/p>\n\n\n\n<p>Los procedimientos almacenados se pueden utilizar para<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Devolver un conjunto de resultados, se puede incluir par\u00e1metros de entrada para especificar el filtro del conjunto resultado.<\/li><li>Ejecutar instrucciones de programaci\u00f3n.<\/li><li>Devolver valores num\u00e9ricos que permiten realizar acciones cuando un grupo de instrucciones se realiz\u00f3 con \u00e9xito o no.<\/li><\/ul>\n\n\n\n<!--more-->\n\n\n\n<script async=\"\" src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\" style=\"display:block; text-align:center;\" data-ad-layout=\"in-article\" data-ad-format=\"fluid\" data-ad-client=\"ca-pub-2636008503986218\" data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Ventajas del uso de procedimientos almacenados<\/strong><\/h3>\n\n\n\n<p><strong>Reutilizaci\u00f3n del c\u00f3digo<\/strong><br>El encapsulamiento en un procedimiento es \u00f3ptimo para reutilizar su c\u00f3digo. Se elimina la necesidad de escribir el mismo c\u00f3digo, se reducen &nbsp;inconsistencias en el c\u00f3digo y permite que cualquier usuario ejecute el c\u00f3digo a\u00fan sin tener acceso a los &nbsp;objetos que hace referencia.<\/p>\n\n\n\n<p><strong>Mayor seguridad<\/strong><br>Se pueden ejecutar SP con instrucciones que hacen referencia a objetos que los usuarios no tienen permisos. El procedimiento realiza la ejecuci\u00f3n del c\u00f3digo y todas las instrucciones y controla el acceso a los &nbsp;objetos a los que hace referencia. Esto hace mas sencillo la asignaci\u00f3n de permisos.&nbsp;Se puede implementar la suplantaci\u00f3n de usuarios usando Exexute As. Existe un nivel fuerte de encapsulamiento.<\/p>\n\n\n\n<p><strong>Tr\u00e1fico de red reducido<\/strong><br>Un SP se ejecuta en un \u00fanico lote de c\u00f3digo. Esto reduce el tr\u00e1fico de red cliente servidor porque \u00fanicamente &nbsp;se env\u00eda a trav\u00e9s de la red la llamada que ejecuta el SP. La encapsulaci\u00f3n del c\u00f3digo del SP permite que viaje a trav\u00e9s de la red como un solo bloque.<\/p>\n\n\n\n<p><strong>Mantenimiento m\u00e1s sencillo<\/strong><br>Se puede trabajar en los aplicativos en base a capas, cualquier cambio en la Base de datos, hace sencillo los cambios en los procedimientos que hacen uso de los objetos cambiados en la BD.<\/p>\n\n\n\n<p><strong>Rendimiento mejorado<\/strong><br>Los procedimientos almacenados se compila la primera vez que se ejecutan y crean un plan de ejecuci\u00f3n que vuelve a usarse en posteriores ejecuciones.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tipos de procedimientos<\/h3>\n\n\n\n<p><strong>Definidos por el usuario<\/strong><br>Se crea por el usuario en las bases de datos definidas por el usuario o en las de sistema (Master, Tempdb, Model y MSDB)<\/p>\n\n\n\n<p><strong>Procedimientos almacenados Temporales<\/strong><br>Los procedimientos temporales son procedimientos definidos por el usuario, estos se almacenan en tempdb. &nbsp;Existen dos tipos de procedimientos temporales: locales (primer caracter es #) y globales (primer caracter ##). &nbsp;Se diferencian entre s\u00ed por los nombres, la visibilidad y la disponibilidad.<br>Los procedimientos temporales locales tienen como primer car\u00e1cter de sus nombres un solo signo de n\u00famero (#); &nbsp;solo son visibles en la conexi\u00f3n actual del usuario y se eliminan cuando se cierra la conexi\u00f3n. &nbsp;Los procedimientos temporales globales presentan dos signos de n\u00famero (##) antes del nombre; &nbsp;lo pueden usar todos los usuarios conectados, se eliminan cuando se desconectan todos los usuarios.<\/p>\n\n\n\n<p><strong>Procedimientos Almacenados del Sistema<\/strong><br>Los procedimientos del sistema son propios de SQL Server. Los caracteres iniciales de estos procedimientos son sp_ &nbsp;la cual no se recomienda para los procedimientos almacenados definidos por el usuario.<\/p>\n\n\n\n<p><strong>Extendidos definidos por el usuario<\/strong><br>Los procedimientos extendidos tienen instrucciones externas en un lenguaje de programaci\u00f3n como puede ser C. &nbsp;Estos procedimientos almacenados son DLL que una instancia de SQL Server puede cargar y ejecutar din\u00e1micamente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sintaxis<\/h2>\n\n\n\n<p><strong>Para crear un procedimiento almacenado se utiliza<\/strong><br>Create procedure NombreProcedimiento<br>(<br>@PrimerParametro TipoDato,<br>@SegundoParametro TipoDato,&#8230;<br>)<br>As<br>Instrucciones del SP<br>go<\/p>\n\n\n\n<p><strong>Para modificar un SP<\/strong><br>Alter procedure NombreProcedimiento<br>(<br>@PrimerParametro TipoDato,<br>@SegundoParametro TipoDato,&#8230; cambios<br>)<br>As<br>Instrucciones del SP con cambios<br>go<\/p>\n\n\n\n<p><strong>Eliminar un SP<\/strong><br>Drop procedure NombreProcedimiento<br>go<\/p>\n\n\n\n<p><strong>Para listar los SP<\/strong><br>select * from sys.procedures<br>go<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ejercicios<\/h2>\n\n\n\n<p>Use Northwind<br>go<\/p>\n\n\n\n<p><strong>&#8212; Procedimiento para listar los productos<\/strong><br>Create procedure spProductosListadoPrecios<br>As<br>Select P.ProductID, P.ProductName,<br>P.UnitPrice , P.UnitsInStock<br>from Products As P<br>go<br><strong>Ejecutar el Store Procedure creado<\/strong><br>Execute spProductosListadoPrecios<br>go<\/p>\n\n\n\n<p><strong>&#8212; Procedimiento para insertar un registro en la tabla Shippers<\/strong><br><strong>&#8212; La instrucci\u00f3n para insertar un Shipper es:<\/strong><br>insert into Shippers (CompanyName, Phone)<br>values (&#8216;Tolva Couriers&#8217;,&#8217;954542452&#8242;)<br>go<br><strong>El SP para insertar Shippers se crea de la siguiente forma.<\/strong><br>create procedure spShippersInsertaNuevo<br>(<br>@NombreEmpresa nvarchar(40),<br>@Fono nvarchar(24)<br>)<br>As<br>insert into Shippers (CompanyName, Phone)<br>values (@NombreEmpresa,@Fono)<br>go<br><strong>Ejecutar el SP, se puede ejecutar de las siguiente formas:<\/strong><br>Execute spShippersInsertaNuevo &#8216;Chasqui&#8217;,&#8217;87545852&#8242;<br>go<br>Execute spShippersInsertaNuevo<br>@Fono = &#8216;345435645&#8217;, @NombreEmpresa =&#8217;Ford&#8217;<br>go<br>Execute spShippersInsertaNuevo<br>@NombreEmpresa =&#8217;Turbo XD&#8217;, @Fono = &#8216;8569856&#8217;<br>go<\/p>\n\n\n\n<script async=\"\" src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\" style=\"display:block; text-align:center;\" data-ad-layout=\"in-article\" data-ad-format=\"fluid\" data-ad-client=\"ca-pub-2636008503986218\" data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p><strong>Procedimiento para el listado de productos &nbsp;de una determinada categor\u00eda<\/strong><br>Create procedure spProductosListadoPorCategoria<br>(<br>@CategoriaCodigo int<br>)<br>As<br>select P.ProductID, P.ProductName,<br>P.UnitPrice , P.UnitsInStock, P.UnitsOnOrder<br>from Products As P<br>where CategoryID = @CategoriaCodigo<br>go<br><strong>Ejecutar el SP<\/strong><br><strong>Productos de categoria 2<\/strong><br>Execute spProductosListadoPorCategoria 2<br>go<br><script>&lt;br \/>      (adsbygoogle = window.adsbygoogle || []).push({});&lt;br \/> <\/script><\/p>\n\n\n\n<p><strong>Modificar el procedimiento de Listado de Productos por categor\u00eda que lo muestre ordenados por precio descendente<\/strong><br>Alter procedure spProductosListadoPorCategoria<br>(<br>@CategoriaCodigo int<br>)<br>As<br>select P.ProductID, P.ProductName,<br>P.UnitPrice , P.UnitsInStock, P.UnitsOnOrder<br>from Products As P<br>where CategoryID = @CategoriaCodigo<br>order by P.UnitPrice desc<br>go<\/p>\n\n\n\n<p><strong>&#8212; Procedimiento para crear una tabla con los productos de una determinada categor\u00eda<\/strong><br>Create procedure spCreaTablaProductosDeCategoria<br>(<br>@CodigoCategoria int<br>)<br>As<br>Declare @NombreTabla nvarchar(40), @DropTablaTSQL nvarchar(100),@CrearTablaTSQL nvarchar(100)<br>set @NombreTabla = &#8216;ProductosDeCategoria&#8217;+ LTRIM(STR(@CodigoCategoria))<br>Set @DropTablaTSQL = &#8216;Drop Table &#8216;+ @NombreTabla<br>Set @CrearTablaTSQL = &#8216;select * into &#8216;+ @NombreTabla + &#8216; from Products where CategoryID = &#8216;+LTRIM(STR(@CodigoCategoria))<br>if exists (select * from sys.tables where name = @NombreTabla)<br>Begin<br>Execute(@DropTablaTSQL)<br>End<br>Execute(@CrearTablaTSQL)<br>go<\/p>\n\n\n\n<p><strong>&nbsp;Ejecutar para la categor\u00eda 3<\/strong><br>Execute spCreaTablaProductosDeCategoria 3<br>go<br><strong>Ver los registros<\/strong><br>select * from Productosdecategoria3<br>go<\/p>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Procedimientos Almacenados&nbsp; Un procedimiento almacenado son instrucciones T-SQL almacenadas con un nombre en la base de datos. Los procedimientos almacenados se pueden utilizar para Devolver un conjunto de resultados, se puede incluir par\u00e1metros de entrada para especificar el filtro del conjunto resultado. Ejecutar instrucciones de programaci\u00f3n. Devolver valores num\u00e9ricos que permiten realizar acciones cuando un &hellip; <\/p>\n<p><a class=\"more-link btn\" href=\"https:\/\/manualsqlserver.com\/?p=314\">Seguir leyendo<\/a><\/p>\n","protected":false},"author":1,"featured_media":936,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[233,8],"tags":[66,53],"class_list":["post-314","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sp","category-programacion","tag-procedimientos-almacenados","tag-sqlserver","nodate","item-wrap"],"_links":{"self":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/314","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=314"}],"version-history":[{"count":6,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/314\/revisions"}],"predecessor-version":[{"id":2101,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/314\/revisions\/2101"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/media\/936"}],"wp:attachment":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=314"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=314"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=314"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}