{"id":1921,"date":"2020-05-26T19:35:29","date_gmt":"2020-05-26T19:35:29","guid":{"rendered":"http:\/\/manualsqlserver.com\/?p=1921"},"modified":"2020-05-26T19:38:35","modified_gmt":"2020-05-26T19:38:35","slug":"fdu-con-varaibles-tipo-tabla-sql-server","status":"publish","type":"post","link":"https:\/\/manualsqlserver.com\/?p=1921","title":{"rendered":"FDU con variables tipo tabla SQL Server"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"200\" height=\"198\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_FDU_y_Variables_Tabla__D.png\" alt=\"\" class=\"wp-image-1922\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_FDU_y_Variables_Tabla__D.png 200w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_FDU_y_Variables_Tabla__D-150x150.png 150w\" sizes=\"auto, (max-width: 200px) 100vw, 200px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Funciones definidas por el usuario con variables tipo tabla en SQL Server<\/h2>\n\n\n\n<p>Las funciones definidas por el usuario, FDU, son porciones de c\u00f3digo guardadas en la base de datos y que retornan un valor o retornan un conjunto de datos, dependiendo de como han sido dise\u00f1adas. (<a href=\"https:\/\/manualsqlserver.com\/?p=335\" target=\"_blank\" rel=\"noreferrer noopener\">Ver Funciones definidas por el usuario<\/a>)<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Las variables tipo tabla son tipos de variables que son definidas como una tabla, su uso es temporal y son muy \u00fatiles en procesos donde se manejan registros y se necesitan almacenar posiblemente de manera temporal. (<a href=\"https:\/\/manualsqlserver.com\/?p=1493\" target=\"_blank\" rel=\"noreferrer noopener\">Ver variables<\/a>) (<a href=\"https:\/\/manualsqlserver.com\/?p=522\" target=\"_blank\" rel=\"noreferrer noopener\">Ver variables tipo tabla<\/a>).<\/p>\n\n\n\n<p>Este art\u00edculo muestra como usar las variables tipo tabla en FDU que retornan una tabla, se recomienda siempre comparar los resultados de las consultas usando Joins (<a href=\"https:\/\/manualsqlserver.com\/?p=215\" target=\"_blank\" rel=\"noreferrer noopener\">Ver Joins<\/a>), usando Subconsultas (<a href=\"https:\/\/manualsqlserver.com\/?p=219\" target=\"_blank\" rel=\"noreferrer noopener\">Ver Subconsultas<\/a>) y el uso de FDU. (<a href=\"https:\/\/manualsqlserver.com\/?p=1810\" target=\"_blank\" rel=\"noreferrer noopener\">Ver comparaci\u00f3n entre Joins, Subconsultas y FDU<\/a>)<\/p>\n\n\n\n<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2636008503986218\"\n     data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p style=\"font-size:26px\"><strong>Ejercicios<\/strong><\/p>\n\n\n\n<p><strong>Usando Northwind<\/strong><br>use Northwind<br>go<\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Ejercicio 1<\/strong><\/p>\n\n\n\n<p><strong>Crear una FDU que retorne una tabla con los productos de una categor\u00eda. Incluir el valor del Stock que es el resultado de multiplicar Precio por cantidad en Stock. La FDU recibir\u00e1 el c\u00f3digo de la categor\u00eda.<\/strong><\/p>\n\n\n\n<p>Create function dbo.fduProductosPorCategoria (@CodigoCategria int)<br>Returns <strong>@ProductosCategoria<\/strong> Table<br>(C\u00f3digo int, Descripci\u00f3n nvarchar(40), Unidad nvarchar(20),<br>Precio Numeric(9,2), Stock Numeric(9,2), [Valor Stock] Numeric(9,2))<br>As<br>Begin<br>insert into @ProductosCategoria<br>select P.ProductID, P.ProductName, P.QuantityPerUnit,<br>P.UnitPrice, P.UnitsInStock, P.UnitPrice*P.UnitsInStock<br>from Products As P<br>where P.CategoryID = @CodigoCategria<br>Return<br>End<br>go<\/p>\n\n\n\n<p><strong>Note que se ha usado una variable llamada @ProductosCategoria de tipo tabla.<br>Para mostrar los productos de la categor\u00eda 1<\/strong><br>select * from dbo.fduProductosPorCategoria(1)<br>go<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_FDU_y_Variables_Tabla_01.png\" alt=\"\" class=\"wp-image-1923\" width=\"793\" height=\"390\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_FDU_y_Variables_Tabla_01.png 1008w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_FDU_y_Variables_Tabla_01-300x148.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_FDU_y_Variables_Tabla_01-768x378.png 768w\" sizes=\"auto, (max-width: 793px) 100vw, 793px\" \/><\/figure>\n\n\n\n<p style=\"font-size:22px\"><strong>Ejercicio 2<\/strong><\/p>\n\n\n\n<p><strong>Mostrar las \u00f3rdenes de un cliente en un rango de fechas, incluir el total<br>de la orden, para el total crear otra FDU que retorna un valor.<\/strong><\/p>\n\n\n\n<p><strong>La FDU que retorna el total de la orden<\/strong><\/p>\n\n\n\n<p>Create function dbo.fduRetornaTotalOrden(@NumeroOrden int)<br>Returns Numeric(9,2)<br>As<br>Begin<br>Declare @TotalOrden Numeric(9,2)<br>Select @TotalOrden = Sum(D.Quantity * D.UnitPrice)<br>from [Order Details] As D where D.OrderID = @NumeroOrden<br>Return @TotalOrden<br>End<br>go<\/p>\n\n\n\n<p><strong>Se puede probar la FDU creada calculando el total de la orden 10248, antes se va a mostrar el detalle de la orden.<\/strong><br>select * from [Order Details] As D<br>where D.OrderID = 10248<br>go<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_FDU_y_Variables_Tabla_02.png\" alt=\"\" class=\"wp-image-1924\" width=\"701\" height=\"186\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_FDU_y_Variables_Tabla_02.png 636w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_FDU_y_Variables_Tabla_02-300x80.png 300w\" sizes=\"auto, (max-width: 701px) 100vw, 701px\" \/><\/figure>\n\n\n\n<p>El total de la orden se obtiene multiplicando precios por cantidades, para esta orden el total es la suma de 14 * <em>12 + 9.8<\/em> * 10 + 34.8*5 = 440<br>La FDU devuelve el valor calculado<br>select dbo.fduRetornaTotalOrden(10248) As Total<br>go<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_FDU_y_Variables_Tabla_03.png\" alt=\"\" class=\"wp-image-1925\" width=\"711\" height=\"186\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_FDU_y_Variables_Tabla_03.png 732w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_FDU_y_Variables_Tabla_03-300x79.png 300w\" sizes=\"auto, (max-width: 711px) 100vw, 711px\" \/><\/figure>\n\n\n\n<p><strong>La FDU que retorna las \u00f3rdenes por Cliente.<\/strong><\/p>\n\n\n\n<p>Create function dbo.fduOrdenesPorClienteRangoFechas<br>(@CodigoCliente nchar(5), @FechaInicial Date, @FechaFinal Date)<br>Returns @OrdenesPorClienteFechas Table<br>([N\u00ba Orden] int, Fecha Date,<br>Total Numeric(9,2), Ciudad nvarchar(15))<br>As<br>Begin<br>insert into @OrdenesPorClienteFechas<br>select O.OrderID, O.OrderDate,<br>dbo.fduRetornaTotalOrden(O.OrderID), O.ShipCity<br>from Orders As O<br>where O.CustomerID = @CodigoCliente and<br>O.OrderDate between @FechaInicial and @FechaFinal<br>Return<br>End<br>go<\/p>\n\n\n\n<p><strong>Para mostrar las \u00f3rdenes del cliente con c\u00f3digo VINET entre Julio y Agosto 1996<\/strong><br>select * from dbo.fduOrdenesPorClienteRangoFechas(&#8216;VINET&#8217;,&#8217;01\/07\/1996&#8242;,&#8217;31\/08\/1996&#8242;)<br>go<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_FDU_y_Variables_Tabla_04.png\" alt=\"\" class=\"wp-image-1926\" width=\"669\" height=\"203\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_FDU_y_Variables_Tabla_04.png 528w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_FDU_y_Variables_Tabla_04-300x91.png 300w\" sizes=\"auto, (max-width: 669px) 100vw, 669px\" \/><\/figure>\n\n\n\n<p>Note el total de la orden 10248 de 440.<\/p>\n\n\n\n<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2636008503986218\"\n     data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Funciones definidas por el usuario con variables tipo tabla en SQL Server Las funciones definidas por el usuario, FDU, son porciones de c\u00f3digo guardadas en la base de datos y que retornan un valor o retornan un conjunto de datos, dependiendo de como han sido dise\u00f1adas. (Ver Funciones definidas por el usuario)<\/p><p><a class=\"more-link btn\" href=\"https:\/\/manualsqlserver.com\/?p=1921\">Seguir leyendo<\/a><\/p>\n","protected":false},"author":1,"featured_media":1922,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,8],"tags":[16,40,51],"class_list":["post-1921","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-consultasdedatos","category-programacion","tag-create-function","tag-join","tag-select","nodate","item-wrap"],"_links":{"self":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/1921","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=1921"}],"version-history":[{"count":2,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/1921\/revisions"}],"predecessor-version":[{"id":1929,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/1921\/revisions\/1929"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/media\/1922"}],"wp:attachment":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1921"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1921"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1921"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}