{"id":522,"date":"2017-09-18T20:20:43","date_gmt":"2017-09-18T20:20:43","guid":{"rendered":"http:\/\/www.manualsqlserver.com\/?p=522"},"modified":"2020-05-20T18:03:57","modified_gmt":"2020-05-20T18:03:57","slug":"variables-tipo-tabla","status":"publish","type":"post","link":"https:\/\/manualsqlserver.com\/?p=522","title":{"rendered":"Variables Tipo Tabla en SQL Server"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"220\" height=\"218\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_VariablesTipoTabla_D.png\" alt=\"\" class=\"wp-image-1317\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_VariablesTipoTabla_D.png 220w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_VariablesTipoTabla_D-150x150.png 150w\" sizes=\"auto, (max-width: 220px) 100vw, 220px\" \/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Variables tipo Tabla<\/strong><\/h1>\n\n\n\n<ul class=\"wp-block-list\"><li>Las Variables Tipo Tabla son tipos de datos que generalmente son utilizados en un lote T-SQL, &nbsp;procedimiento almacenado o funci\u00f3n definida por el usuario.<\/li><li>Las variables tipo tabla se crea y definen igual a las tablas con la diferencia que tienen una alcance de vida definido.<\/li><li>Se debe evaluar usando los planes de ejecuci\u00f3n de cada opci\u00f3n entre Variables tipo tabla y tablas temporales.<\/li><li>Use las variables tipo tabla o las tablas temporales con conjunto de datos peque\u00f1os.<\/li><\/ul>\n\n\n\n<!--more-->\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Beneficios<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Duraci\u00f3n o alcance. estos objetos viven \u00fanicamente durante la ejecuci\u00f3n del lote, funci\u00f3n o procedimiento almacenado.<\/li><li>Tiempos de bloqueo m\u00e1s cortos.<\/li><li>Cuando se usan en procedimientos almacenados realizan menos re compilaciones.<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Consideraciones<\/strong><\/h3>\n\n\n\n<p>El rendimiento de las variable tipo tabla no es \u00f3ptimo cuando el resultado es demasiado grande.<\/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<h3 class=\"wp-block-heading\"><strong>Sintaxis<\/strong><\/h3>\n\n\n\n<p>Declare @NombreVariableTipoTabla Table<br>(<br>Campo1 TipoDatos, &#8230;<br>)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Limitaciones<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>No se puede usar la opci\u00f3n Into en un Select (<a href=\"http:\/\/www.manualsqlserver.com\/?p=289\">Ver Consultas Opciones<\/a>)<\/li><li>No se puede truncar la tabla (Truncate)<\/li><li>Una vez creadas no se pueden modificar (<a href=\"http:\/\/www.manualsqlserver.com\/?p=147\">Ver Alter Table<\/a>)<\/li><li>S\u00f3lo permite clave primaria y restricci\u00f3n Unique.<\/li><li>No se puede usar funciones definidas por el usuario (UDF) en un check constraint, columna calculada o default constraint. (<a href=\"http:\/\/www.manualsqlserver.com\/?p=335\">Ver FDU<\/a>)<\/li><li>No se puede usar tipos de datos definidos por el usuario (<a href=\"http:\/\/www.manualsqlserver.com\/?p=131\">Ver Tipos de datos definidos por el usuario<\/a>)<\/li><li>No se puede eliminar la tabla usando Drop Table<\/li><li>Las variables de tipo tabla no se pueden acceder en procedimientos anidados<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Ejemplos<\/strong><\/h3>\n\n\n\n<p><strong>Usando Northwind<\/strong><br>use Northwind<br>go<\/p>\n\n\n\n<p><strong>Ejercicio 01<\/strong><br><strong>Crear una tabla de tipo variable y asignar los datos de los productos de categor\u00eda 1<\/strong><\/p>\n\n\n\n<p>Declare @ProductosCategoria1 Table<br>( Codigo nchar(3) Primary key,<br>Descripcion nvarchar(50)<br>)<br>Insert into @ProductosCategoria1 select ProductID, ProductName from Products<br>where CategoryID = 1<br>select * from @ProductosCategoria1<br>go<\/p>\n\n\n\n<p>El resultado se muestra en la siguiente imagen<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_VariablesTipoTabla_01.png\" alt=\"\" class=\"wp-image-1315\" width=\"848\" height=\"480\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_VariablesTipoTabla_01.png 1006w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_VariablesTipoTabla_01-300x170.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_VariablesTipoTabla_01-768x435.png 768w\" sizes=\"auto, (max-width: 848px) 100vw, 848px\" \/><\/figure><\/div>\n\n\n\n<p><strong>Ejercicio 02<\/strong><br><strong>Crear una tabla con los datos de los clientes y la cantidad de \u00f3rdenes generadas en un a\u00f1o determinado<\/strong><br><strong>Ejemplo: Para 1997<\/strong><\/p>\n\n\n\n<p>Declare @TotalOrdenesClientes1997 Table<br>(CodigoCliente nchar(5), NombreCliente nvarchar(100),<br>CantidadOrdenes Numeric(9,0))<br>Insert into @TotalOrdenesClientes1997<br>select C.CustomerID, C.CompanyName , COUNT(O.OrderID)<br>from Customers As C<br>join Orders As O on C.CustomerID = O.CustomerID<br>where YEAR(O.OrderDate) = 1997<br>Group by C.CustomerID, C.CompanyName<br>select * from @TotalOrdenesClientes1997 order by CantidadOrdenes desc<br>go<\/p>\n\n\n\n<p>Resultado:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_VariablesTipoTabla_02.png\" alt=\"\" class=\"wp-image-1316\" width=\"844\" height=\"585\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_VariablesTipoTabla_02.png 914w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_VariablesTipoTabla_02-300x208.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_VariablesTipoTabla_02-768x533.png 768w\" sizes=\"auto, (max-width: 844px) 100vw, 844px\" \/><\/figure><\/div>\n\n\n\n<p><strong>Usando tabla temporal, el bloque anterior puede ser como sigue<\/strong><\/p>\n\n\n\n<p>Create table #TotalOrdenesClientes1997<br>(CodigoCliente nchar(5), NombreCliente nvarchar(100),<br>CantidadOrdenes Numeric(9,0))<br>Insert into #TotalOrdenesClientes1997<br>select C.CustomerID, C.CompanyName , COUNT(O.OrderID)<br>from Customers As C<br>join Orders As O on C.CustomerID = O.CustomerID<br>where YEAR(O.OrderDate) = 1997<br>Group by C.CustomerID, C.CompanyName<br>select * from #TotalOrdenesClientes1997 order by CantidadOrdenes desc<br>go<\/p>\n\n\n\n<p>En este caso, queda la tabla temporal creada y se tendr\u00e1 que eliminar expl\u00edcitamente usando Drop&nbsp;o cuando el usuario se desconecte se eliminar\u00e1 de manera autom\u00e1tica.<br>Si analiza los costos de cada opci\u00f3n del plan de ejecuci\u00f3n podr\u00e1 notar que para este conjunto de resultados es igual al usar variables de tipo tabla o tablas temporales.<\/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><strong>Ejercicio 03<\/strong><br><strong>Crear una variable tipo tabla e insertar los registros manualmente<\/strong><\/p>\n\n\n\n<p>Declare @Areas table<br>(AreasCodigo nchar(5), AreasNombre nvarchar(100),<br>AreasFechaCreacion Date)<br>Insert into @Areas<br>values (&#8216;98653&#8242;,&#8217;Gerencia General&#8217;,&#8217;15\/10\/2014&#8242;), (&#8216;45732&#8242;,&#8217;Producci\u00f3n&#8217;,&#8217;16\/11\/1996&#8242;),<br>(&#8216;57794&#8242;,&#8217;Ventas&#8217;,&#8217;21\/11\/2015&#8242;),(&#8216;35795&#8242;,&#8217;Log\u00edstica&#8217;,&#8217;01\/10\/2000&#8242;),<br>(&#8216;90569&#8242;,&#8217;Contabilidad&#8217;,&#8217;10\/02\/1999&#8242;),(&#8216;34947&#8242;,&#8217;Proyectos&#8217;,&#8217;24\/02\/1996&#8242;)<br>select * from @Areas order by AreasNombre<br>go<\/p>\n\n\n\n<p><strong>Importante<\/strong><br><strong>Si ejecuta la consulta para mostrar los datos de la tabla @Areas fuera del lote<\/strong><\/p>\n\n\n\n<p>select * from @Areas order by AreasNombre<br>go<\/p>\n\n\n\n<p>Aparece un mensaje que falta declarar la variable de tabla @Areas<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Variables tipo Tabla Las Variables Tipo Tabla son tipos de datos que generalmente son utilizados en un lote T-SQL, &nbsp;procedimiento almacenado o funci\u00f3n definida por el usuario. Las variables tipo tabla se crea y definen igual a las tablas con la diferencia que tienen una alcance de vida definido. Se debe evaluar usando los planes &hellip; <\/p>\n<p><a class=\"more-link btn\" href=\"https:\/\/manualsqlserver.com\/?p=522\">Seguir leyendo<\/a><\/p>\n","protected":false},"author":1,"featured_media":1317,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,5,8,9],"tags":[28,37,46,47,52,53,57,63],"class_list":["post-522","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-consultasdedatos","category-esquemastablas","category-programacion","category-registros-vistas","tag-esquemas","tag-insert","tag-particion","tag-permisos","tag-sql","tag-sqlserver","tag-tablas","tag-variables","nodate","item-wrap"],"_links":{"self":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/522","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=522"}],"version-history":[{"count":1,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/522\/revisions"}],"predecessor-version":[{"id":1319,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/522\/revisions\/1319"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/media\/1317"}],"wp:attachment":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=522"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=522"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=522"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}