<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Freddy Angarita</title><link>http://geeks.ms/blogs/fangarita/default.aspx</link><description>Tecnologías Microsoft, especialmente SqlServer 2008 y Desarrollo .Net</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>[Code] Archivo de configuración de Ejemplo para Instalaciones Desatendidas de SqlServer en Windows Server 2012 Core</title><link>http://geeks.ms/blogs/fangarita/archive/2013/04/04/code-archivo-de-configuraci-243-n-de-ejemplo-para-instalaciones-desatendidas-de-sqlserver.aspx</link><pubDate>Thu, 04 Apr 2013 20:13:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:209055</guid><dc:creator>Freddy Angarita</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fangarita/rsscomments.aspx?PostID=209055</wfw:commentRss><comments>http://geeks.ms/blogs/fangarita/archive/2013/04/04/code-archivo-de-configuraci-243-n-de-ejemplo-para-instalaciones-desatendidas-de-sqlserver.aspx#comments</comments><description>&lt;p&gt;En Sql Server es permitido realizar &lt;a href="http://msdn.microsoft.com/es-co/library/ms144259.aspx" title="Instalaciones Desatendidas"&gt;instalaciones desatendidas&lt;/a&gt;, esto se puede realizar de dos maneras, la primera es usando la linea de comando, en donde se pueden enviar par&amp;aacute;metros al ejecutable Setup.exe ubicado en los discos de instalaci&amp;oacute;n de SqlServer &lt;/p&gt;
&lt;p&gt;Como Archivo adjunto, se encuentra un archivo de configuraci&amp;oacute;n de ejemplo para ser usado para realizar una instalaci&amp;oacute;n con todas las caracter&amp;iacute;sticas (Qu&amp;eacute; se permiten para WindowsServer Core)&lt;/p&gt;
&lt;p&gt;Este Art&amp;iacute;culo es complementario de &lt;a href="http://geeks.ms/blogs/fangarita/archive/2013/04/04/how-to-c-243-mo-realizar-una-instalaci-243-n-de-sqlserver-2012-en-windows-2012-core.aspx"&gt;[How to] C&amp;oacute;mo realizar una instalaci&amp;oacute;n de SqlServer 2012 en Windows 2012 Core&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Los comentarios son bienvenidos, espero sea de ayuda,&lt;/p&gt;
&lt;p&gt;&lt;b&gt;FREDY LEANDRO ANGARITA CASTELLANOS&lt;br /&gt;Sql Server MVP&lt;br /&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=209055" width="1" height="1"&gt;</description><enclosure url="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.20.90.55/Configuracion.txt" length="1627" type="text/plain" /></item><item><title>[How to] Cómo realizar una instalación de SqlServer 2012 en Windows 2012 Core</title><link>http://geeks.ms/blogs/fangarita/archive/2013/04/04/how-to-c-243-mo-realizar-una-instalaci-243-n-de-sqlserver-2012-en-windows-2012-core.aspx</link><pubDate>Thu, 04 Apr 2013 20:04:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:209054</guid><dc:creator>Freddy Angarita</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fangarita/rsscomments.aspx?PostID=209054</wfw:commentRss><comments>http://geeks.ms/blogs/fangarita/archive/2013/04/04/how-to-c-243-mo-realizar-una-instalaci-243-n-de-sqlserver-2012-en-windows-2012-core.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Instalacion7.png"&gt;&lt;/a&gt;Para realizar la prueba se requiere una m&amp;aacute;quina (f&amp;iacute;sica o virtual) para realizar la prueba, si no se cuenta con una licencia se puede descargar una versi&amp;oacute;n de prueba en la p&amp;aacute;gina de &lt;a href="http://technet.microsoft.com/es-co/evalcenter/hh670538.aspx"&gt;Microsoft&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Para el ejemplo usar&amp;eacute; Hyper-V en una m&amp;aacute;quina con Windows 8 y SqlServer 2012 Developer Edition (&lt;a href="http://www.microsoft.com/en-US/download/details.aspx?id=29066"&gt;descargar versi&amp;oacute;n de prueba&lt;/a&gt;), aunque funciona para todas las versiones&lt;/p&gt;
&lt;p&gt;Pero antes de empezar qu&amp;eacute; es &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/hh846323(v=vs.85).aspx"&gt;Windows Server Core&lt;/a&gt;, para ponerlo en t&amp;eacute;rminos simples, es una versi&amp;oacute;n que no tiene GUI, es decir, interfase gr&amp;aacute;fica con el usuario&amp;nbsp;(Algunos Programas como el bloc de notas s&amp;iacute; est&amp;aacute;n disponibles)&amp;nbsp;reduciendo as&amp;iacute; la cantidad de recursos requeridos por el sistema operativo para funcionar , lo que implica que la administraci&amp;oacute;n del sistema operativo debe realizarse enteramente mediante consola, claro, para SqlServer, existe la posiblidad de conectar remotamente un Management Studio lo que permitir&amp;aacute; su administraci&amp;oacute;n gr&amp;aacute;fica&lt;/p&gt;
&lt;p&gt;Una vez instalada o conectada la m&amp;aacute;quina virtual Windows Server 2012 Code Edition presenta una consola como la que se presenta en la siguiente imagen:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Instalaci_F300_n1.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/0x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Instalaci_F300_n1.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;En el Men&amp;uacute; de Hyper-V, Seleccionar Media =&amp;gt; DVD Drive =&amp;gt; Insert Disk... y seleccionar el Archivo .ISO del instalador de SqlServer, para este ejemplo usar&amp;eacute; Developer Edition, pero para un servidor se debe usar Standar o Enterprise dependiendo del esquema de licencimiento con el que se cuente&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Instalacion2.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/0x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Instalacion2.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Una vez se conecte el Disco, el mismo aparecer&amp;aacute; como un&amp;nbsp;DVD en la m&amp;aacute;quina virtual&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Instalacion3.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/0x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Instalacion3.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Una vez preparado el archivo de configuraci&amp;oacute;n, se procede a la ejecuci&amp;oacute;n de la instrucci&amp;oacute;n que inicia la instalaci&amp;oacute;n usando el archivo de configuraci&amp;oacute;n de ejemplo ubicado en &lt;a href="http://geeks.ms/blogs/fangarita/archive/2013/04/04/code-archivo-de-configuraci-243-n-de-ejemplo-para-instalaciones-desatendidas-de-sqlserver.aspx"&gt;[Code] Archivo de configuraci&amp;oacute;n de Ejemplo para Instalaciones Desatendidas de SqlServer en Windows Server 2012 Core&lt;/a&gt;, el cual contiene comentarios que explican las diferentes configuraciones realizadas en el archivo&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Instalacion4.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/0x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Instalacion4.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Una vez se inicia la instalaci&amp;oacute;n correctamente se visualiza en pantalla el di&amp;aacute;logo presentado en la siguiente gr&amp;aacute;fica:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Instalacion5.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/0x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Instalacion5.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dado que las opciones de configuraci&amp;oacute;n ya fueron dadas en el archivo de &lt;a href="http://geeks.ms/blogs/fangarita/archive/2013/04/04/code-archivo-de-configuraci-243-n-de-ejemplo-para-instalaciones-desatendidas-de-sqlserver.aspx"&gt;configuraci&amp;oacute;n el instalador&lt;/a&gt; no realiza ninguna pregunta al usuario, y los valores no provistos ser&amp;aacute;n tomados por defecto por instalador, para realizar una instalaci&amp;oacute;n completa se recomienda revisar todas las &lt;a href="http://msdn.microsoft.com/es-co/library/hh231669.aspx"&gt;opciones de instalaci&amp;oacute;n&lt;/a&gt;; en la siguiente gr&amp;aacute;fica se observa el avance de la instalaci&amp;oacute;n:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Instalacion6.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/0x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Instalacion6.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Una vez Finalizada la instalaci&amp;oacute;n:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Instalacion7.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/0x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Instalacion7.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Para habilitar las conexiones remotas se debe ejecutar&lt;/p&gt;
&lt;pre&gt;EXEC sys.sp_configure N&amp;#39;remote access&amp;#39;, N&amp;#39;1&amp;#39; 

GO 

RECONFIGURE WITH OVERRIDE 

GO 
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Los comentarios son bienvenidos, espero sea de ayuda,&lt;/p&gt;
&lt;p&gt;&lt;b&gt;FREDY LEANDRO ANGARITA CASTELLANOS&lt;br /&gt;Sql Server MVP&lt;br /&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/0x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=209054" width="1" height="1"&gt;</description></item><item><title>[Code] Detección de Cambios - Parte1</title><link>http://geeks.ms/blogs/fangarita/archive/2013/01/19/code-detecci-243-n-de-cambios-parte1.aspx</link><pubDate>Sat, 19 Jan 2013 18:23:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:208327</guid><dc:creator>Freddy Angarita</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fangarita/rsscomments.aspx?PostID=208327</wfw:commentRss><comments>http://geeks.ms/blogs/fangarita/archive/2013/01/19/code-detecci-243-n-de-cambios-parte1.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;Detectar cambios en una base de datos es muy importante para el desarrollo de soluciones de inteligencia de negocios y el mantenimiento de los warehouses asociados, por lo que realizarlo de manera eficiente y f&amp;aacute;cil de mantener es de vital importancia para permitir un desarrollo y sostenibilidad del proyecto en el tiempo&lt;/p&gt;
&lt;p&gt;En este especial de detecci&amp;oacute;n de cambios se presentar&amp;aacute;n tres diferentes t&amp;eacute;cnicas usables en diferentes escenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dimensi&amp;oacute;n de cambio lento en SSIS&lt;/li&gt;
&lt;li&gt;Merge Join &lt;/li&gt;
&lt;li&gt;T&amp;eacute;cnica especial de detecci&amp;oacute;n de cambios SSIS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En este primer art&amp;iacute;culo discutiremos el uso de la transformaci&amp;oacute;n de cambio lento de SSIS, esta transformaci&amp;oacute;n &lt;/p&gt;
&lt;p&gt;Para este art&amp;iacute;culo se usar&amp;aacute; lla base de datos&amp;nbsp; &lt;a href="http://msftdbprodsamples.codeplex.com/downloads/get/165405"&gt;AdventureWorksDW2012&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;1El primer paso, ser&amp;aacute; crear una tabla de prueba en donde realizaremos la detecci&amp;oacute;n del cambio:&lt;/p&gt;
&lt;pre&gt;CREATE TABLE [dbo].[TablaPrueba](
	[ProductKey] [int] IDENTITY(1,1) NOT NULL,
	[ProductAlternateKey] [nvarchar](25) NULL,
	[ProductSubcategoryKey] [int] NULL,
	[WeightUnitMeasureCode] [nchar](3) NULL,
	[SizeUnitMeasureCode] [nchar](3) NULL,
	[EnglishProductName] [nvarchar](50) NOT NULL
) ON [PRIMARY]

GO

&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Luego se crea (o sea agrega un paquete para realizar la detecci&amp;oacute;n de cambios)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Creaci_F300_n-Proyecto.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x660/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Creaci_F300_n-Proyecto.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Luego se agrega un DataFlowTask&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Paso1.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x640/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Paso1.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dentro del DataFlowTask &lt;/p&gt;
&lt;p&gt;&amp;nbsp;Se agrega un origen de datos Ole DB con la siguiente consulta:&lt;/p&gt;
&lt;pre&gt;SELECT [ProductKey]
      ,[ProductAlternateKey]
      ,[ProductSubcategoryKey]
      ,[WeightUnitMeasureCode]
      ,[SizeUnitMeasureCode]
      ,[EnglishProductName] 
  FROM [DimProduct]&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;Luego se agrega una transformaci&amp;oacute;n de cambio lento (Slowly Changing Dimension)&lt;/p&gt;
&lt;p&gt;Luego de conectar el origen de datos con la transformaci&amp;oacute;n de cambio lento se edita la transformaci&amp;oacute;n&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Configuraci&amp;oacute;n de Datos&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En este punto se selecciona la conexi&amp;oacute;n con la base de datos con la que se desea trabajar y la tabla en la que se desean ubicar los cambios&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Paso2.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Paso2.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tambi&amp;eacute;n, se selecciona la llave de negocio (para este caso se selecciona&amp;nbsp;ProductAlternateKey)&amp;nbsp;con la que se va a realizar la comparaci&amp;oacute;n (se puede pensar como un JOIN) &lt;/p&gt;
&lt;p&gt;El objeto es identificar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si no existe la llave en la tabla destino (para este caso Pruebas), crear el registro&lt;/li&gt;
&lt;li&gt;Si existe la llave en la tabla destino, actualizar las columnas configuradas&lt;/li&gt;
&lt;li&gt;Si existe en la tabla destino y no en la tabla de origen debe ser eliminado el registro en la&amp;nbsp; tabla destino&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Configuc&amp;iacute;on el tipo de atributo de cada columna&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Paso3.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Paso3.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border="1" width="80%" style="border-collapse:collapse;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td bgcolor="#c0c0c0"&gt;Tipo Configuraci&amp;oacute;n&lt;/td&gt;
&lt;td bgcolor="#c0c0c0"&gt;Descripci&amp;oacute;n&lt;/td&gt;
&lt;td bgcolor="#c0c0c0"&gt;Uso&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed Attribute&lt;/td&gt;
&lt;td&gt;Attributo Fijo, si cambia se presenta un error&lt;/td&gt;
&lt;td&gt;Se usa para validar que valores no cambien y que se presente un error en tal caso&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changing Attribute&lt;/td&gt;
&lt;td&gt;Atributo Cambiante, si cambia se actualiza&lt;/td&gt;
&lt;td&gt;Se usa para actualizar en la tabla destino los cambios encontrados al comprarla con la tabla destino&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Historical Attribute&lt;/td&gt;
&lt;td&gt;Atributo hist&amp;oacute;rico, guarda los cambios en nuevas filas&lt;/td&gt;
&lt;td&gt;Permite llevar un historial de cambios realizados en la tabla origen en la tabla destino&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Configuraci&amp;oacute;n de atributos fijos y cambiantes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Paso4.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Paso4.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si se han seleccionado atributos fijos se podr&amp;aacute; seleccionar la opci&amp;oacute;n para que la transformaci&amp;oacute;n falle en caso que se detecten cambios &lt;/li&gt;
&lt;li&gt;Si se han seleccionado atributos cambiantes se puede activar la opci&amp;oacute;n para que realice cambios en todos los registros que se encuentren (eso es importante dado que Merge, el cual se estudiar&amp;aacute; en la parte 2) no permite este comportamiento&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Configuraci&amp;oacute;n de Inferencia de Miembros de Dimensi&amp;oacute;n&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Paso5.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Paso5.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;En caso que se est&amp;eacute; haciendo la actualizaci&amp;oacute;n de un Warehouse y alguno de los campos haga referencia a una dimensi&amp;oacute;n a&amp;uacute;n no cargada, el sistema infiere este elemento y lo agrega (como si existiera en la tabla relacionada); esta pr&amp;aacute;ctica no es recomendada ya que puede llevar a incosistencias relacionales&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FInalizaci&amp;oacute;n Asistente&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Paso6.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Paso6.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Presenta un resumen con las opciones seleccionadas&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Visualizaci&amp;oacute;n paquete&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Paso7.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Paso7.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;Ejecuci&amp;oacute;n del paquete&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Paso8.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Paso8.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Luego de modificar una fila en la tabla origen&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Paso9.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Paso9.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;Eacute;ste m&amp;eacute;todo tiene varias ventajas, pero una de sus desventajas es que la actualizaci&amp;oacute;n- inserci&amp;oacute;n - borrado se realizan registro a registro lo que no ofrece alto desempe&amp;ntilde;o &lt;/p&gt;
&lt;p&gt;Para casos en donde la cantidad de registros es poca &amp;eacute;sta tecnica puede ser favorable dada su f&amp;aacute;cil aplicaci&amp;oacute;n&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Los comentarios son bienvenidos, espero sea de ayuda,&lt;/p&gt;
&lt;p&gt;&lt;b&gt;FREDY LEANDRO ANGARITA CASTELLANOS&lt;br /&gt;Sql Server MVP&lt;br /&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=208327" width="1" height="1"&gt;</description></item><item><title>[Sample] Cómo crear un reporte flexible usando Jerarquías (Recursivo) </title><link>http://geeks.ms/blogs/fangarita/archive/2012/12/11/sample-c-243-mo-crear-un-reporte-flexible-usando-jerarqu-237-as-recursivo.aspx</link><pubDate>Wed, 12 Dec 2012 01:05:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:207768</guid><dc:creator>Freddy Angarita</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fangarita/rsscomments.aspx?PostID=207768</wfw:commentRss><comments>http://geeks.ms/blogs/fangarita/archive/2012/12/11/sample-c-243-mo-crear-un-reporte-flexible-usando-jerarqu-237-as-recursivo.aspx#comments</comments><description>&lt;p&gt;Saludos, A continuaci&amp;oacute;n publico el archivo de ejemplo del art&amp;iacute;culo &lt;span&gt;&lt;a href="http://geeks.ms/blogs/fangarita/archive/2012/12/11/code-c-243-mo-crear-un-reporte-flexible-usando-jerarqu-237-as-recursivo.aspx"&gt;[Code] C&amp;oacute;mo crear un reporte flexible usando Jerarqu&amp;iacute;as (Recursivo)&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Los comentarios son bienvenidos, espero sea de ayuda,&lt;/p&gt;
&lt;p&gt;&lt;b&gt;FREDY LEANDRO ANGARITA CASTELLANOS&lt;br /&gt;Sql Server MVP&lt;br /&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=207768" width="1" height="1"&gt;</description><enclosure url="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.20.77.68/Recursivo.zip" length="2610" type="application/x-zip-compressed" /></item><item><title>[Code] Cómo crear un reporte flexible usando Jerarquías (Recursivo)</title><link>http://geeks.ms/blogs/fangarita/archive/2012/12/11/code-c-243-mo-crear-un-reporte-flexible-usando-jerarqu-237-as-recursivo.aspx</link><pubDate>Wed, 12 Dec 2012 00:11:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:207767</guid><dc:creator>Freddy Angarita</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fangarita/rsscomments.aspx?PostID=207767</wfw:commentRss><comments>http://geeks.ms/blogs/fangarita/archive/2012/12/11/code-c-243-mo-crear-un-reporte-flexible-usando-jerarqu-237-as-recursivo.aspx#comments</comments><description>&lt;p&gt;Saludos&lt;/p&gt;
&lt;p&gt;Dentro del desarrollo de un reporte se presentan varios retos, uno de los mas recurrentes es crear un reporte flexible, que se acomode a los cambios en los datos sin necesidad de modificar el reporte, en el presente art&amp;iacute;culo presento una caracter&amp;iacute;stica muy interesante de Reporting Services&lt;/p&gt;
&lt;p&gt;Consideremos primero la siguiente Jerarqu&amp;iacute;a:&lt;/p&gt;
&lt;p align="left"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Jerarqu_ED00_a.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x412/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Jerarqu_ED00_a.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Basado en el esquema anterior generemos una tabla de ejemplo&lt;/p&gt;
&lt;pre&gt;select 1 as Id, null as Padre, &amp;#39;Sede Central&amp;#39; as Nombre, 0 as Valor union all
select 2 as Id, 1 as Padre, &amp;#39;Estado&amp;#39; as Nombre, 0 as Valor  union all
select 3 as Id, 2 as Padre, &amp;#39;Ciudad1&amp;#39; as Nombre, 0 as Valor  union all
select 4 as Id, 2 as Padre, &amp;#39;Ciudad2&amp;#39; as Nombre, 0 as Valor  union all
select 5 as Id, 3 as Padre, &amp;#39;Sede Centro&amp;#39; as Nombre, 11 as Valor  union all
select 6 as Id, 3 as Padre, &amp;#39;Sede Sur&amp;#39; as Nombre, 12 as Valor  union all
select 7 as Id, 4 as Padre, &amp;#39;Sede Norte&amp;#39; as Nombre, 15 as Valor  union all
select 8 as Id, 4 as Padre, &amp;#39;Sede Occidente&amp;#39; as Nombre , 10 as Valor 
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Creando el Reporte&lt;/p&gt;
&lt;p&gt;1) Se agrega un DataSet con los datos de ejemplo&lt;/p&gt;
&lt;p align="left"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Creando-Tabla.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x635/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Creando-Tabla.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2) En la parte de presentaci&amp;oacute;n, para el presente ejemplo, se selecciona&amp;nbsp;siguiente&lt;/p&gt;
&lt;p align="left"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Creando-Tabla1.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x623/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Creando-Tabla1.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;3) Para el presente ejemplo seleccionamos el estilo por defecto&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Creando-Tabla2.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x623/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Creando-Tabla2.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;4) Una vez finalizado el asitente para la creaci&amp;oacute;n de una tabla, editamos el grupo del reporte (recordemos que tenemos un solo grupo para el reporte que se est&amp;aacute; creando), Se debe agrupar por la columna Id dado que esta presenta un valor &amp;uacute;nico y es parte de la llave para poder lograr recursividad en el reporte&lt;/p&gt;
&lt;p align="left"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Creando-Tabla3.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x483/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Creando-Tabla3.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;5) En la misma ventana, se selecciona Avanzado (Advanced) y se estable como Padre Recursivo (Recursive Parent) al campo &lt;em&gt;Padre&lt;/em&gt; el cual contiene la informaci&amp;oacute;n sobre cual de los nodos es el padre en la Jerarqu&amp;iacute;a&lt;/p&gt;
&lt;p align="left"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Creando-Tabla4.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x483/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Creando-Tabla4.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;6) Si se ejecuta el reporte no se obtiene un resultado muy interesante hasta el momento&lt;/p&gt;
&lt;p align="left"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/438x338/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Reporte1.png" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;7) Pero si&amp;nbsp;se usa&amp;nbsp;la funci&amp;oacute;n Level() se podr&amp;aacute; detectar el nivel de la jerarqu&amp;iacute;a de la fila actual lo que es &amp;uacute;til para generar una indentaci&amp;oacute;n que ayude a la comprensi&amp;oacute;n de los datos&lt;/p&gt;
&lt;p&gt;En la propiedad Padding=&amp;gt;Left del campo Nombre se agrega el siguiente c&amp;oacute;digo&lt;/p&gt;
&lt;p&gt;=CStr(2 + (Level()*20)) + &amp;quot;pt&amp;quot;&lt;/p&gt;
&lt;p&gt;Lo que crea una indentaci&amp;oacute;n como la presentada en la imagen&lt;/p&gt;
&lt;p align="left"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/511x274/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Reporte3.png" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;8) Si se desea agregar un esquema de colores al reporte para seguir alg&amp;uacute;n tipo de convensi&amp;oacute;n se puede usar una paleta de colores, como la del siguiente ejemplo&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;p&gt;
&lt;table border="0" width="80%"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td bgcolor="#002c53"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td bgcolor="#00618c"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td bgcolor="#13a69c"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td bgcolor="#cfc1a6"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td bgcolor="#c4a169"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td bgcolor="#ffffff"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;Para lograr aplicar la paleta seleccionada se agrega c&amp;oacute;digo al reporte:&lt;/p&gt;
&lt;p align="left"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Reporte4.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x514/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Reporte4.png" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;El resultado Final:&lt;/p&gt;
&lt;p align="left"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/505x281/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Reporte5.png" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Claro, un dise&amp;ntilde;ador gr&amp;aacute;fico lograr&amp;aacute; un mejor resultado con la paleta de colores&amp;nbsp;pero para este caso es netamente ilustrativo&lt;/p&gt;
&lt;p&gt;El archivo del reporte de ejemplo se puede encontrar en: &lt;span&gt;&lt;a href="http://geeks.ms/blogs/fangarita/archive/2012/12/11/sample-c-243-mo-crear-un-reporte-flexible-usando-jerarqu-237-as-recursivo.aspx"&gt;[Sample] C&amp;oacute;mo crear un reporte flexible usando Jerarqu&amp;iacute;as (Recursivo)&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Los comentarios son bienvenidos, espero sea de ayuda,&lt;/p&gt;
&lt;p&gt;&lt;b&gt;FREDY LEANDRO ANGARITA CASTELLANOS&lt;br /&gt;Sql Server MVP&lt;br /&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=207767" width="1" height="1"&gt;</description></item><item><title>[Code] Cómo obtener las columnas de una tabla identificando su llave primaria</title><link>http://geeks.ms/blogs/fangarita/archive/2012/11/20/code-c-243-mo-obtener-las-columnas-de-una-tabla-identificando-su-llave-primaria.aspx</link><pubDate>Tue, 20 Nov 2012 18:44:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:207484</guid><dc:creator>Freddy Angarita</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fangarita/rsscomments.aspx?PostID=207484</wfw:commentRss><comments>http://geeks.ms/blogs/fangarita/archive/2012/11/20/code-c-243-mo-obtener-las-columnas-de-una-tabla-identificando-su-llave-primaria.aspx#comments</comments><description>&lt;p&gt;Se presenta el script para obtener todos los campos de una tabla y saber cual(es) de ellos son llave primaria&lt;/p&gt;
&lt;pre&gt;declare @tabla sysname 
set @tabla = &amp;#39;mitabla&amp;#39; --El nombre de la tabla que se quiere evaluar

;With PrimaryKeys (object_id, column_id) as (
SELECT ic.object_id, ic.column_id AS ColumnName FROM 
sys.indexes AS i 
INNER JOIN sys.index_columns AS ic ON i.OBJECT_ID = ic.OBJECT_ID AND i.index_id = ic.index_id and ic.OBJECT_ID = OBJECT_ID(@tabla,N&amp;#39;U&amp;#39;)
)
select name, case when PrimaryKeys.object_id is null then 0 else 1 end IsKey from sys.columns AS C
left join PrimaryKeys ON c.object_id = PrimaryKeys.object_id and c.column_id = PrimaryKeys.column_id
where c.OBJECT_ID = OBJECT_ID(@tabla,N&amp;#39;U&amp;#39;)
&lt;/pre&gt;
&lt;p&gt;Obs&amp;eacute;rvese que se usa la funci&amp;oacute;n OBJECT_ID para obtener el Id del Objeto que se quiere evaluar, otra opci&amp;oacute;n ser&amp;iacute;a: &lt;/p&gt;
&lt;pre&gt;OBJECT_NAME(ic.OBJECT_ID)  = @Tabla&lt;/pre&gt;
&lt;p&gt;pero es mas eficiente&amp;nbsp;como se presenta en la consulta superior&amp;nbsp;dado que s&amp;oacute;lo se ejecuta una vez la funci&amp;oacute;n escalar OBJECT_ID en lugar de una vez por cada registro, se observa tambi&amp;eacute;n el uso de una instrucci&amp;oacute;n CTE para calcular las &lt;a href="http://geeks.ms/blogs/fangarita/archive/2012/11/20/code-c-243-mo-obtener-la-llave-primaria-de-una-tabla.aspx" title="llaves de la tabla"&gt;llaves de la tabla&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Los comentarios son bienvenidos, espero sea de ayuda,&lt;/p&gt;
&lt;p&gt;&lt;b&gt;FREDY LEANDRO ANGARITA CASTELLANOS&lt;br /&gt;Sql Server MVP&lt;br /&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=207484" width="1" height="1"&gt;</description></item><item><title>[CODE] Cómo concatenar los resultados de una consulta </title><link>http://geeks.ms/blogs/fangarita/archive/2012/11/20/code-c-243-mo-concatenar-los-resultados-de-una-consulta.aspx</link><pubDate>Tue, 20 Nov 2012 17:50:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:207482</guid><dc:creator>Freddy Angarita</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fangarita/rsscomments.aspx?PostID=207482</wfw:commentRss><comments>http://geeks.ms/blogs/fangarita/archive/2012/11/20/code-c-243-mo-concatenar-los-resultados-de-una-consulta.aspx#comments</comments><description>&lt;p&gt;Como se observa en el art&amp;iacute;culo &lt;a href="http://geeks.ms/blogs/fangarita/archive/2012/11/20/code-c-243-mo-obtener-la-llave-primaria-de-una-tabla.aspx"&gt;[CODE] C&amp;oacute;mo obtener la llave primaria de una tabla&lt;/a&gt;, es posible concatenar el resultado de una consulta en una variable, lo cual es especialmente &amp;uacute;til en la generaci&amp;oacute;n de c&amp;oacute;digo din&amp;aacute;mico:&lt;/p&gt;
&lt;pre&gt;declare @key varchar(8000)
set @key = &amp;#39;&amp;#39;
SELECT @key  = @key  + COALESCE(TABLE_NAME + &amp;#39;,&amp;#39; , &amp;#39;&amp;#39;)  from INFORMATION_SCHEMA.TABLES

if len(@key) &amp;gt; 0 set @key = LEFT(@key,len(@key) - 1) --Eliminar la coma que sobra al final

print @key
&lt;/pre&gt;
&lt;p&gt;Se debe tener en cuenta que existen algunas limintantes, por ejemplo se debe considerar el tama&amp;ntilde;o m&amp;aacute;ximo de la variable, que dependiendo de la versi&amp;oacute;n de SqlServer puede ser 8000 y usando varchar(max) puede ser m&amp;aacute;ximo de 2,147,483,647 caracteres&lt;/p&gt;
&lt;p&gt;Es de notar que usar funciones CLR o funciones de texto avanzadas de SqlServer 2012 puede mejorarse el rendimiento de esta soluci&amp;oacute;n&lt;/p&gt;
&lt;p&gt;Los comentarios son bienvenidos, espero sea de ayuda, &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;FREDY LEANDRO ANGARITA CASTELLANOS&lt;br /&gt;Sql Server MVP&lt;br /&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=207482" width="1" height="1"&gt;</description></item><item><title>[CODE] Cómo obtener la llave primaria de una tabla</title><link>http://geeks.ms/blogs/fangarita/archive/2012/11/20/code-c-243-mo-obtener-la-llave-primaria-de-una-tabla.aspx</link><pubDate>Tue, 20 Nov 2012 17:35:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:207481</guid><dc:creator>Freddy Angarita</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fangarita/rsscomments.aspx?PostID=207481</wfw:commentRss><comments>http://geeks.ms/blogs/fangarita/archive/2012/11/20/code-c-243-mo-obtener-la-llave-primaria-de-una-tabla.aspx#comments</comments><description>&lt;p&gt;Obtener la llave primaria de una tabla &lt;/p&gt;
&lt;p&gt;Normalmente y una de las primeras (adem&amp;aacute;s de ser la forma en que funciona para todas las versiones), dado que usa las consultas est&amp;aacute;ndard INFORMATION_SCHEMA, es la que se presenta a continuaci&amp;oacute;n:&lt;/p&gt;
&lt;pre&gt;declare @Keys varchar(8000)

set @Keys = &amp;#39;&amp;#39; --Se estable a cadena vac&amp;iacute;a porque si deja en nulo el resultado final ser&amp;iacute;a nulo

SELECT @Keys = @Keys + COALESCE(isc.COLUMN_NAME + &amp;#39;,&amp;#39; , &amp;#39;&amp;#39;) FROM 
INFORMATION_SCHEMA.COLUMNS AS isc INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
AS kcs ON isc.TABLE_NAME = kcs.TABLE_NAME AND isc.COLUMN_NAME = kcs.COLUMN_NAME 
AND LEFT(kcs.CONSTRAINT_NAME, 2) = &amp;#39;PK&amp;#39;

print @Keys --Presenta las llaves separadas por coma
&lt;/pre&gt;
&lt;p&gt;Otra consulta, en la que se usa la metadata de la base de datos es: (y la recomendada): &lt;/p&gt;
&lt;pre&gt;SELECT i.name AS IndexName,
OBJECT_NAME(ic.OBJECT_ID) AS TableName,
COL_NAME(ic.OBJECT_ID,ic.column_id) AS ColumnName
FROM sys.indexes AS i 
INNER JOIN sys.index_columns AS ic ON i.OBJECT_ID = ic.OBJECT_ID AND i.index_id = ic.index_id and i.is_primary_key = 1 
&lt;/pre&gt;
&lt;p&gt;El uso de la primera o la segunda estar&amp;aacute; determinado por la versi&amp;oacute;n de sql y qu&amp;eacute; tan est&amp;aacute;ndard es la soluci&amp;oacute;n que se est&amp;eacute; desarrollando&lt;/p&gt;
&lt;p&gt;Espero sea de ayuda,&lt;/p&gt;
&lt;p&gt;&lt;b&gt;FREDY LEANDRO ANGARITA CASTELLANOS&lt;br /&gt;Sql Server MVP&lt;br /&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=207481" width="1" height="1"&gt;</description></item><item><title>[PPT] Presentación Novedades SqlServer 2012 BI</title><link>http://geeks.ms/blogs/fangarita/archive/2012/04/25/pdf-presentaci-243-n-novedades-sqlserver-2012-bi.aspx</link><pubDate>Wed, 25 Apr 2012 20:21:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:204665</guid><dc:creator>Freddy Angarita</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fangarita/rsscomments.aspx?PostID=204665</wfw:commentRss><comments>http://geeks.ms/blogs/fangarita/archive/2012/04/25/pdf-presentaci-243-n-novedades-sqlserver-2012-bi.aspx#comments</comments><description>&lt;p&gt;Adjunto el archivo de la presentaci&amp;oacute;n sobre novedades de Inteligencia de negocios en el Sql Server 2012 - Del evento&amp;nbsp;Saturday 124&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204665" width="1" height="1"&gt;</description><enclosure url="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.20.46.65/SQL-Saturday.pptx" length="1340337" type="application/vnd.openxmlformats-officedocument.pres" /></item><item><title>[WebCast] Creación de un Modelo Semántico Tabular Sql Server 2012</title><link>http://geeks.ms/blogs/fangarita/archive/2012/04/10/webcast-creaci-243-n-de-un-modelo-sem-225-ntico-tabular-sql-server-2012.aspx</link><pubDate>Tue, 10 Apr 2012 16:32:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:204384</guid><dc:creator>Freddy Angarita</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fangarita/rsscomments.aspx?PostID=204384</wfw:commentRss><comments>http://geeks.ms/blogs/fangarita/archive/2012/04/10/webcast-creaci-243-n-de-un-modelo-sem-225-ntico-tabular-sql-server-2012.aspx#comments</comments><description>&lt;p&gt;En el video se observa paso a paso la creaci&amp;oacute;n&amp;nbsp;y exploraci&amp;oacute;n de un modelo sem&amp;aacute;ntico tabular en Sql Server 2012&lt;/p&gt;
&lt;p align="center"&gt;&lt;iframe width="400" frameborder="0" src="http://player.vimeo.com/video/40091958?title=0&amp;amp;byline=0&amp;amp;portrait=0" height="300"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204384" width="1" height="1"&gt;</description></item><item><title>[Code] Nueva versión crear tabla a partir de un texto separado por comas (CSV)</title><link>http://geeks.ms/blogs/fangarita/archive/2012/01/17/code-nueva-versi-243-n-crear-tabla-a-partir-de-un-texto-separado-por-comas-csv.aspx</link><pubDate>Wed, 18 Jan 2012 02:16:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:202789</guid><dc:creator>Freddy Angarita</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fangarita/rsscomments.aspx?PostID=202789</wfw:commentRss><comments>http://geeks.ms/blogs/fangarita/archive/2012/01/17/code-nueva-versi-243-n-crear-tabla-a-partir-de-un-texto-separado-por-comas-csv.aspx#comments</comments><description>&lt;p&gt;&lt;span&gt;En un art&amp;iacute;culo anterior, &lt;/span&gt;&lt;span&gt;&lt;a href="http://geeks.ms/blogs/fangarita/archive/2011/01/03/code-crear-una-tabla-a-apartir-de-un-texto-se.aspx"&gt;&lt;span style="color:#000000;"&gt;[Code] Crear una tabla a partir de un texto separado por comas (CSV)&lt;/span&gt;&lt;/a&gt;, se present&amp;oacute; c&amp;oacute;mo realizar &amp;eacute;sta tarea de la manera m&amp;aacute;s simple, ahora, se complementar&amp;aacute; &amp;eacute;sta soluci&amp;oacute;n presentando una alternativa que usa CTEs para realizar el trabajo recursivo de analizar las palabras en la sentencia&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Usando la capacida de las expresiones CTEs de crear iteraciones se permite la creaci&amp;oacute;n de la iteraci&amp;oacute;n consigo mismo, es decir en la primera parte, se pone la semilla y en la segunda parte (luego de union all) se implementa la iteraci&amp;oacute;n, la cual devuelve las posiciones inicial y final del texto al que se le va a aplicar substring:&lt;/p&gt;
&lt;pre&gt;CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512)) 
RETURNS table 
AS 
RETURN ( 
    WITH Pieces(pn, start, stop) AS ( 
      SELECT 1, 1, CHARINDEX(@sep, @s) 
      UNION ALL 
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1) 
      FROM Pieces 
      WHERE stop &amp;gt; 0 
    ) 
    SELECT pn, 
      SUBSTRING(@s, start, CASE WHEN stop &amp;gt; 0 THEN stop-start ELSE 512 END) AS s 
    FROM Pieces 
  ) 
&lt;/pre&gt;
&lt;p&gt;La soluci&amp;oacute;n anterior presenta una forma interesante de aproximarse al problema pero a&amp;uacute;n usa recursi&amp;oacute;n, esto se puede eliminar usando XML como base de an&amp;aacute;lisis&lt;/p&gt;
&lt;pre&gt;CREATE FUNCTION [dbo].[Split] (@sep VARCHAR(32), @s VARCHAR(MAX)) 
 
RETURNS @t TABLE 
    ( 
        val VARCHAR(MAX) 
    )    
AS 
    BEGIN 
        DECLARE @xml XML 
        SET @XML = N&amp;#39;&amp;#39; + REPLACE(@s, @sep, &amp;#39;&amp;#39;) + &amp;#39;&amp;#39; 
 
        INSERT INTO @t(val) 
        SELECT r.value(&amp;#39;.&amp;#39;,&amp;#39;VARCHAR(255)&amp;#39;) as Item 
        FROM @xml.nodes(&amp;#39;//root/r&amp;#39;) AS RECORDS(r) 
 
        RETURN 
    END 
&lt;/pre&gt;
&lt;p&gt;El truco consiste en convertir el texto, en un xml y luego usando el tipo de datos especial (y sus funciones) leemos la informaci&amp;oacute;n como una tabla desde XML, el problema con esta soluci&amp;oacute;n es que tiene problemas de desempe&amp;ntilde;o y se presenta solo como referencia&lt;/p&gt;
&lt;p&gt;Tambi&amp;eacute;n se presenta uno de&amp;nbsp;mis trucos favoritos el uso de la funci&amp;oacute;n &lt;a href="http://msdn.microsoft.com/es-co/library/cc280463.aspx"&gt;dm_fts_parser&lt;/a&gt;, la cual permite realizar &amp;eacute;ste an&amp;aacute;lisis r&amp;aacute;pidamente, con la ventaja de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ser una funci&amp;oacute;n del sistema, &lt;/li&gt;
&lt;li&gt;permitir configurar el idioma&lt;/li&gt;
&lt;li&gt;Ser sensible al acentro y may&amp;uacute;sculas&lt;/li&gt;
&lt;li&gt;Poder usar una lista de palabras a ignorar&lt;/li&gt;
&lt;li&gt;M&amp;aacute;s funcionalidades&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;select display_term from sys.dm_fts_parser(&amp;#39;&amp;quot;&amp;#39; + &amp;#39;Mi texto separado por espacios&amp;#39; + &amp;#39;&amp;quot;&amp;#39;, 1033, 0,0) &lt;/pre&gt;
&lt;p&gt;Es ejemplo est&amp;aacute; para idioma ingl&amp;eacute;s con el c&amp;oacute;digo 1033, para un listado completo&amp;nbsp;se puede consultar el listado &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splocale.lcid.aspx"&gt;LCID&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Espero sea de ayuda, &lt;/p&gt;
&lt;p&gt;&lt;b&gt;FREDY LEANDRO ANGARITA CASTELLANOS&lt;br /&gt;Sql Server MVP&lt;br /&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=202789" width="1" height="1"&gt;</description></item><item><title>[Code] Cómo convertir un número a letras</title><link>http://geeks.ms/blogs/fangarita/archive/2012/01/17/code-c-243-mo-convertir-un-n-250-mero-a-letras.aspx</link><pubDate>Wed, 18 Jan 2012 02:02:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:202787</guid><dc:creator>Freddy Angarita</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fangarita/rsscomments.aspx?PostID=202787</wfw:commentRss><comments>http://geeks.ms/blogs/fangarita/archive/2012/01/17/code-c-243-mo-convertir-un-n-250-mero-a-letras.aspx#comments</comments><description>&lt;p&gt;Lo primero que se debe advertir antes de poner el c&amp;oacute;digo a disposici&amp;oacute;n de todos, es que no recomiendo esta aproximaci&amp;oacute;n de manera pr&amp;aacute;ctica dado que SQL est&amp;aacute; optimizado para c&amp;aacute;lculos basados en conjuntos (Selects, Joins y dem&amp;aacute;s); manejo de cadenas y c&amp;aacute;lculos se deber&amp;iacute;an hacer de otras maneras (CLR, C&amp;oacute;digo Ciente, etc.), pero si alguna vez se necesita o si se quiere traducir a otro lenguaje se puede usar el siguiente c&amp;oacute;digo para generar n&amp;uacute;meros como letras. Para tener m&amp;aacute;s claridad sobre el tema de buenas pr&amp;aacute;cticas se puede revisar el art&amp;iacute;culo de &lt;a href="http://geeks.ms/blogs/fangarita/archive/2011/01/17/info-optimizaci-243-n-de-consultas-parte-1-generalidades.aspx"&gt;optimizaci&amp;oacute;n de consultas&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;No es el c&amp;oacute;digo m&amp;aacute;s eficiente que se puede escribir para el tema, pero funciona:&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;create PROCEDURE [dbo].[sp_Dinero_a_Texto]
(
  @Numero NUMERIC(19,4)
 )
AS
BEGIN
 
  SET NOCOUNT ON
  DECLARE @lnEntero INT,
    @lcRetorno VARCHAR(512),
    @lnTerna INT,
    @lcMiles VARCHAR(512),
    @lcCadena VARCHAR(512),
    @lnUnidades INT,
    @lnDecenas INT,
    @lnCentenas INT,
    @lnFraccion INT
 
  SELECT @lnEntero = CAST(@Numero AS INT),
    @lnFraccion = (@Numero - @lnEntero) * 100,
    @lcRetorno = &amp;#39;&amp;#39;,
    @lnTerna = 1
 
  WHILE @lnEntero &amp;gt; 0
  BEGIN /* WHILE */
 
    -- Recorro columna por columna
    SELECT @lcCadena = &amp;#39;&amp;#39;
    SELECT @lnUnidades = @lnEntero % 10
    SELECT @lnEntero = CAST(@lnEntero/10 AS INT)
    SELECT @lnDecenas = @lnEntero % 10
    SELECT @lnEntero = CAST(@lnEntero/10 AS INT)
    SELECT @lnCentenas = @lnEntero % 10
    SELECT @lnEntero = CAST(@lnEntero/10 AS INT)	

	--print cast(@lnCentenas as varchar(3)) + cast(@lnDecenas as varchar(3))+ cast(@lnUnidades as varchar(3))
	--print @lnEntero
 
    -- Analizo las unidades
    SELECT @lcCadena =
    CASE /* UNIDADES */
      WHEN @lnUnidades = 1 AND @lnTerna = 1 THEN &amp;#39;UNO &amp;#39; + @lcCadena
      WHEN @lnUnidades = 1 AND @lnTerna &amp;lt;&amp;gt; 1 THEN &amp;#39;UN &amp;#39; + @lcCadena
      WHEN @lnUnidades = 2 THEN &amp;#39;DOS &amp;#39; + @lcCadena
      WHEN @lnUnidades = 3 THEN &amp;#39;TRES &amp;#39; + @lcCadena
      WHEN @lnUnidades = 4 THEN &amp;#39;CUATRO &amp;#39; + @lcCadena
      WHEN @lnUnidades = 5 THEN &amp;#39;CINCO &amp;#39; + @lcCadena
      WHEN @lnUnidades = 6 THEN &amp;#39;SEIS &amp;#39; + @lcCadena
      WHEN @lnUnidades = 7 THEN &amp;#39;SIETE &amp;#39; + @lcCadena
      WHEN @lnUnidades = 8 THEN &amp;#39;OCHO &amp;#39; + @lcCadena
      WHEN @lnUnidades = 9 THEN &amp;#39;NUEVE &amp;#39; + @lcCadena
      ELSE @lcCadena
    END /* UNIDADES */

	print @lcCadena
 
    -- Analizo las decenas
    SELECT @lcCadena =
    CASE /* DECENAS */
      WHEN @lnDecenas = 1 THEN
        CASE @lnUnidades
          WHEN 0 THEN &amp;#39;DIEZ &amp;#39;
          WHEN 1 THEN &amp;#39;ONCE &amp;#39;
          WHEN 2 THEN &amp;#39;DOCE &amp;#39;
          WHEN 3 THEN &amp;#39;TRECE &amp;#39;
          WHEN 4 THEN &amp;#39;CATORCE &amp;#39;
          WHEN 5 THEN &amp;#39;QUINCE &amp;#39;
          ELSE &amp;#39;DIECI&amp;#39; + @lcCadena
        END
      WHEN @lnDecenas = 2 AND @lnUnidades = 0 THEN &amp;#39;VEINTE &amp;#39; + @lcCadena
      WHEN @lnDecenas = 2 AND @lnUnidades &amp;lt;&amp;gt; 0 THEN &amp;#39;VEINTI&amp;#39; + @lcCadena
      WHEN @lnDecenas = 3 AND @lnUnidades = 0 THEN &amp;#39;TREINTA &amp;#39; + @lcCadena
      WHEN @lnDecenas = 3 AND @lnUnidades &amp;lt;&amp;gt; 0 THEN &amp;#39;TREINTA Y &amp;#39; + @lcCadena
      WHEN @lnDecenas = 4 AND @lnUnidades = 0 THEN &amp;#39;CUARENTA &amp;#39; + @lcCadena
      WHEN @lnDecenas = 4 AND @lnUnidades &amp;lt;&amp;gt; 0 THEN &amp;#39;CUARENTA Y &amp;#39; + @lcCadena
      WHEN @lnDecenas = 5 AND @lnUnidades = 0 THEN &amp;#39;CINCUENTA &amp;#39; + @lcCadena
      WHEN @lnDecenas = 5 AND @lnUnidades &amp;lt;&amp;gt; 0 THEN &amp;#39;CINCUENTA Y &amp;#39; + @lcCadena
      WHEN @lnDecenas = 6 AND @lnUnidades = 0 THEN &amp;#39;SESENTA &amp;#39; + @lcCadena
      WHEN @lnDecenas = 6 AND @lnUnidades &amp;lt;&amp;gt; 0 THEN &amp;#39;SESENTA Y &amp;#39; + @lcCadena
      WHEN @lnDecenas = 7 AND @lnUnidades = 0 THEN &amp;#39;SETENTA &amp;#39; + @lcCadena
      WHEN @lnDecenas = 7 AND @lnUnidades &amp;lt;&amp;gt; 0 THEN &amp;#39;SETENTA Y &amp;#39; + @lcCadena
      WHEN @lnDecenas = 8 AND @lnUnidades = 0 THEN &amp;#39;OCHENTA &amp;#39; + @lcCadena
      WHEN @lnDecenas = 8 AND @lnUnidades &amp;lt;&amp;gt; 0 THEN &amp;#39;OCHENTA Y &amp;#39; + @lcCadena
      WHEN @lnDecenas = 9 AND @lnUnidades = 0 THEN &amp;#39;NOVENTA &amp;#39; + @lcCadena
      WHEN @lnDecenas = 9 AND @lnUnidades &amp;lt;&amp;gt; 0 THEN &amp;#39;NOVENTA Y &amp;#39; + @lcCadena
      ELSE @lcCadena
    END /* DECENAS */

	print @lcCadena
 
    -- Analizo las centenas
    SELECT @lcCadena =
    CASE /* CENTENAS */
      WHEN @lnCentenas = 1 AND @lnUnidades = 0 AND @lnDecenas = 0 THEN &amp;#39;CIEN &amp;#39; + @lcCadena
      WHEN @lnCentenas = 1 AND NOT(@lnUnidades = 0 AND @lnDecenas = 0) THEN &amp;#39;CIENTO &amp;#39; + @lcCadena
      WHEN @lnCentenas = 2 THEN &amp;#39;DOSCIENTOS &amp;#39; + @lcCadena
      WHEN @lnCentenas = 3 THEN &amp;#39;TRESCIENTOS &amp;#39; + @lcCadena
      WHEN @lnCentenas = 4 THEN &amp;#39;CUATROCIENTOS &amp;#39; + @lcCadena
      WHEN @lnCentenas = 5 THEN &amp;#39;QUINIENTOS &amp;#39; + @lcCadena
      WHEN @lnCentenas = 6 THEN &amp;#39;SEISCIENTOS &amp;#39; + @lcCadena
      WHEN @lnCentenas = 7 THEN &amp;#39;SETECIENTOS &amp;#39; + @lcCadena
      WHEN @lnCentenas = 8 THEN &amp;#39;OCHOCIENTOS &amp;#39; + @lcCadena
      WHEN @lnCentenas = 9 THEN &amp;#39;NOVECIENTOS &amp;#39; + @lcCadena
      ELSE @lcCadena
    END /* CENTENAS */
	print @lcCadena
 
    -- Analizo los millares
    SELECT @lcCadena =
    CASE /* TERNA */
      WHEN @lnTerna = 1 THEN @lcCadena
      WHEN @lnTerna = 2 AND (@lnUnidades + @lnDecenas + @lnCentenas &amp;lt;&amp;gt; 0) THEN @lcCadena + &amp;#39; MIL &amp;#39;
      WHEN @lnTerna = 3 AND (@lnUnidades + @lnDecenas + @lnCentenas &amp;lt;&amp;gt; 0) AND
        @lnUnidades = 1 AND @lnDecenas = 0 AND @lnCentenas = 0 THEN @lcCadena + &amp;#39; MILLON &amp;#39;
      WHEN @lnTerna = 3 AND (@lnUnidades + @lnDecenas + @lnCentenas &amp;lt;&amp;gt; 0) AND
        NOT (@lnUnidades = 1 AND @lnDecenas = 0 AND @lnCentenas = 0) THEN @lcCadena + &amp;#39; MILLONES &amp;#39;
      WHEN @lnTerna = 4 AND (@lnUnidades + @lnDecenas + @lnCentenas &amp;lt;&amp;gt; 0) THEN @lcCadena + &amp;#39; MIL MILLONES &amp;#39;
      ELSE &amp;#39;&amp;#39;
    END /* MILLARES */
	print @lcCadena
 
    -- Armo el retorno columna a columna
	--print @lcCadena
    SELECT @lcRetorno = @lcCadena + @lcRetorno
    SELECT @lnTerna = @lnTerna + 1
 
  END /* WHILE */
 
  IF @lnTerna = 1
    SELECT @lcRetorno = &amp;#39;CERO&amp;#39;
 
  SELECT RTRIM(@lcRetorno) + CASE WHEN LEN(LTRIM(STR(@lnFraccion,2))) = 1 THEN &amp;#39;0&amp;#39;+LTRIM(STR(@lnFraccion,2))
                                               ELSE LTRIM(STR(@lnFraccion,2)) END AS Texto
 
END

&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Los comentarios son bienvenidos, espero sea de ayuda, &lt;/p&gt;
&lt;p&gt;&lt;b&gt;FREDY LEANDRO ANGARITA CASTELLANOS&lt;br /&gt;Sql Server MVP&lt;br /&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=202787" width="1" height="1"&gt;</description></item><item><title>[Code] Llenado de Espacio en Datos (Generación de Datos Acumulados) por Grupos</title><link>http://geeks.ms/blogs/fangarita/archive/2012/01/08/code-llenado-de-espacio-en-datos-generaci-243-n-de-datos-acumulados-por-grupos.aspx</link><pubDate>Sun, 08 Jan 2012 16:34:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:202648</guid><dc:creator>Freddy Angarita</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fangarita/rsscomments.aspx?PostID=202648</wfw:commentRss><comments>http://geeks.ms/blogs/fangarita/archive/2012/01/08/code-llenado-de-espacio-en-datos-generaci-243-n-de-datos-acumulados-por-grupos.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;Llenado de Espacio en Datos (Generaci&amp;oacute;n de Datos Acumulados) por Grupos&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Normalmente los productos de software llevan un registro de los &lt;i&gt;hechos&lt;/i&gt; que se Fsentan en el negocio, ventas, desembolsos, cobros, intereses, etc. Pero por supuesto no todos los d&amp;iacute;as se vende, se desembolsa, se cobra initereses, c&amp;oacute;mo podemos resolver de una &lt;i&gt;eficiente&lt;/i&gt; la necesidad ver los datos acumulados, este escenario, por lo meno de manera parcial, fu&amp;eacute; resuelto en un art&amp;iacute;culo anterior &lt;a href="http://geeks.ms/blogs/fangarita/archive/2010/10/28/code-c-243-mo-calcular-un-total-acumulado-r-225-pido-sin-cursores.aspx"&gt;[Code] C&amp;oacute;mo calcular un total acumulado R&amp;aacute;pido SIN Cursores&lt;/a&gt;. Este art&amp;iacute;culo complementa esa soluci&amp;oacute;n presentando c&amp;oacute;mo se har&amp;iacute;a lo mismo para generar datos acumulados (o llenar espacios) teniendo en cuenta diferentes grupos dentro de los datos&lt;/p&gt;
&lt;p&gt;Tambi&amp;eacute;n se presentar&amp;aacute; una aplicaci&amp;oacute;n de otro art&amp;iacute;culo llamado &lt;a href="http://geeks.ms/blogs/fangarita/archive/2010/12/22/code-c-243-mo-generar-n-filas-r-225-pido-sql-server.aspx"&gt;[Code] C&amp;oacute;mo generar N Filas R&amp;aacute;pido Sql Server&lt;/a&gt; el cual se usar&amp;aacute; para generar los datos necesarios para llenar los espacios de la informaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Datos de ejemplo&lt;/p&gt;
&lt;pre&gt;declare @hechos table (id int, fecha date, producto int, venta decimal)

insert into @hechos	values (1, &amp;#39;2011-09-01&amp;#39;, 1, 10)
insert into @hechos	values (2, &amp;#39;2011-09-03&amp;#39;, 1, 20)
insert into @hechos	values (3, &amp;#39;2011-09-04&amp;#39;, 1, 2)
insert into @hechos	values (4, &amp;#39;2011-09-08&amp;#39;, 1, 1)
insert into @hechos	values (5, &amp;#39;2011-09-10&amp;#39;, 1, 3)
insert into @hechos	values (6, &amp;#39;2011-09-12&amp;#39;, 1, 4)

insert into @hechos	values (7, &amp;#39;2011-09-01&amp;#39;, 2, 3)
insert into @hechos	values (8, &amp;#39;2011-09-03&amp;#39;, 2, 2)
insert into @hechos	values (9, &amp;#39;2011-09-04&amp;#39;, 2, 1)
insert into @hechos	values (10, &amp;#39;2011-09-08&amp;#39;, 2, 5)
insert into @hechos	values (11, &amp;#39;2011-09-10&amp;#39;, 2, 6)
insert into @hechos	values (12, &amp;#39;2011-09-12&amp;#39;, 2, 7)&lt;/pre&gt;
&lt;p&gt;Los datos en formato tabla:&lt;/p&gt;
&lt;table align="center" width="50%" cellpadding="0" cellspacing="0" border="1" style="border-collapse:collapse;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td bgcolor="#000080"&gt;&lt;b&gt;&lt;span style="color:#ffffff;"&gt;Id&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td bgcolor="#000080"&gt;&lt;b&gt;&lt;span style="color:#ffffff;"&gt;Fecha&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td bgcolor="#000080"&gt;&lt;b&gt;&lt;span style="color:#ffffff;"&gt;Producto&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td bgcolor="#000080"&gt;&lt;b&gt;&lt;span style="color:#ffffff;"&gt;Venta&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2011-09-01&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2011-09-03&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;2011-09-04&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2011-09-08&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;2011-09-10&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;2011-09-12&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;2011-09-01&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;2011-09-03&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;2011-09-04&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;2011-09-08&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;2011-09-10&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;2011-09-12&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Observemos que las fechas de venta para cada producto no suceden en d&amp;iacute;as consecutivos, se tienen 2 diferentes productos a los que se quiere calcularle sus ventas acumuladas por d&amp;iacute;a y una cantidad de ventas&lt;/p&gt;
&lt;p&gt;Lo primero que haremos es calcular el n&amp;uacute;mero de d&amp;iacute;as de diferencia entre la mayor y menos fecha de toda la tabla (para todos los productos)&lt;/p&gt;
&lt;pre&gt;declare @FechaMin date, @FechaMax Date, @Diferencia int
select  @FechaMin = min(Fecha), @FechaMax = MAX(Fecha) from @hechos

set @Diferencia = DATEDIFF(dd,@FechaMin, @FechaMax)&lt;/pre&gt;
&lt;p&gt;Alternativamente podr&amp;iacute;amos crear una tabla que tenga la fecha m&amp;iacute;nima y m&amp;aacute;xima por cada producto, pero se presentar&amp;aacute; as&amp;iacute; para mantener simple el ejemplo.&lt;/p&gt;
&lt;p&gt;Pasos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se generea un CTE con una tabla que tiene todas las fechas posibles (incluso las que no est&amp;aacute;n en la tabla @hechos), llamado Fechas, El c&amp;oacute;digo de GenTable se encuentra en &lt;a href="http://geeks.ms/blogs/fangarita/archive/2010/12/22/code-c-243-mo-generar-n-filas-r-225-pido-sql-server.aspx"&gt;[Code] C&amp;oacute;mo generar N Filas R&amp;aacute;pido Sql Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tambi&amp;eacute;n se declara una tabla @Acumulado que tendr&amp;aacute; el resultado final con los valores acumulados por producto&lt;/li&gt;
&lt;li&gt;En el CTE ProductoFecha aplicamos una funci&amp;oacute;n de conjunto cross join para aplicar cada fecha generada a cada una de los productos de @hechos, lo que nos d&amp;aacute; como resultado todas las fechas posibles para cada producto&lt;/li&gt;
&lt;li&gt;Luego, se inserta en @Acumulado el resutaldo de hacer left join entre ProductoFecha (que tiene todas las fechas) y @Hechos lo que nos da, cada producto y cada fecha posible, en las fechas que no se realizaron ventas se agrega cero (0)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;declare @Acumulado table (fecha date, producto int, venta decimal, VentaAcumulada decimal)

;With Fechas (Fecha) as
(
select DATEADD(dd,GT.i,@FechaMin) Fecha from dbo.GenTable(0,@Diferencia,1) GT
)
, ProductoFecha (Producto, Fecha) as (
select distinct Producto, Fechas.Fecha from @hechos cross join Fechas
)
insert into @Acumulado (fecha, producto, venta, VentaAcumulada)
Select PF.Fecha, PF.Producto, isnull(H.Venta,0) as Ventas, 0  from ProductoFecha PF left join @hechos H ON PF.Producto = H.producto and PF.Fecha = h.fecha
&lt;/pre&gt;
&lt;p&gt;Ahora se procede a calcular el total acumulado por grupos:&lt;/p&gt;
&lt;pre&gt;declare @runningtotal decimal , @ProductoActual int

set @runningtotal = 0 
select @ProductoActual = 0 

--Anterior
update @Acumulado 
set 
@runningtotal = VentaAcumulada = case when not @ProductoActual = Producto then venta else 
case when Venta = 0 then @runningtotal else venta end
end
,@ProductoActual = Producto&lt;/pre&gt;
&lt;p&gt;La parte clave es donde se define el Producto actual por que permite la detecci&amp;oacute;n de cambio de grupos para generar as&amp;iacute; su acumulado, esta t&amp;eacute;cnica puede ser aplicada a m&amp;uacute;ltiples grupos, por ejemplo, ciudad - producto solo agregando otro grupo (para el caso del ejemplo ser&amp;iacute;a @ProductoActual) en el orden que se necesite y as&amp;iacute; generar todos los grupos necesarios&lt;/p&gt;
&lt;p&gt;Los resultados:&lt;/p&gt;
&lt;p&gt;


&lt;/p&gt;
&lt;table align="center" width="50%" cellpadding="0" cellspacing="0" border="1" style="border-collapse:collapse;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td bgcolor="#000080"&gt;&lt;b&gt;&lt;span style="color:#ffffff;"&gt;fecha&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td bgcolor="#000080"&gt;&lt;b&gt;&lt;span style="color:#ffffff;"&gt;producto&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td bgcolor="#000080"&gt;&lt;b&gt;&lt;span style="color:#ffffff;"&gt;venta&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td bgcolor="#000080"&gt;&lt;b&gt;&lt;span style="color:#ffffff;"&gt;VentaAcumulada&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-01&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-02&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-03&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-04&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-05&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-06&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-07&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-08&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-09&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-10&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-11&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-01&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-02&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-03&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-04&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-05&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-06&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-07&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-08&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-09&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-10&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011-09-11&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Para que &amp;eacute;sta soluci&amp;oacute;n funcione, los datos deben estar previamente ordenados (por producto y fecha)&lt;/p&gt;
&lt;p&gt;Espero sea de ayuda, &lt;/p&gt;
&lt;p&gt;&lt;b&gt;FREDY LEANDRO ANGARITA CASTELLANOS&lt;br /&gt;Sql Server MVP&lt;br /&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=202648" width="1" height="1"&gt;</description><enclosure url="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.20.26.48/Articulo-Acumulado-Llenando-Gaps.sql" length="2113" type="application/octet-stream" /></item><item><title>[Code] Conteo de Filas de cada una de las tablas de la base de datos</title><link>http://geeks.ms/blogs/fangarita/archive/2012/01/05/code-conteo-de-filas-de-cada-una-de-las-tablas-de-la-base-de-datos.aspx</link><pubDate>Fri, 06 Jan 2012 01:20:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:202626</guid><dc:creator>Freddy Angarita</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fangarita/rsscomments.aspx?PostID=202626</wfw:commentRss><comments>http://geeks.ms/blogs/fangarita/archive/2012/01/05/code-conteo-de-filas-de-cada-una-de-las-tablas-de-la-base-de-datos.aspx#comments</comments><description>&lt;p&gt;&lt;span style="font-family:Arial;font-size:x-small;"&gt;&lt;strong&gt;Conteo de Filas de cada tabla&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Arial;font-size:x-small;"&gt;Haciendo diagn&amp;oacute;stico de las bases de datos, realizando seguimientos al crecimiento del n&amp;uacute;mero de registros y en fin para conocer el n&amp;uacute;mero de registros en todas las tablas existen varias t&amp;eacute;cnicas pero existen unas mejores que otras y a contiuaci&amp;oacute;n se presentar&amp;aacute;n:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Arial;font-size:x-small;"&gt;Una de las aproximaciones es usar uno de los procedimientos almacenados m&amp;aacute;s pr&amp;aacute;cticas que tiene TSql sp_MSforeachtable la cual nos permite ejecutar alg&amp;uacute;n tipo de instrucci&amp;oacute;n para cada una de las tablas de la base de datos, incluso admite filtros&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;exec sp_MSforeachtable &amp;#39;select &amp;#39;&amp;#39;?&amp;#39;&amp;#39; TableName, count(*) Cnt from ?&amp;#39;;&lt;/pre&gt;
&lt;p&gt;&lt;span style="font-family:Arial;font-size:x-small;"&gt;El asunto con esta soluci&amp;oacute;n es que se genera un resultset para cada una de las tablas (es decir, no es un solo resultado, sino uno por cada tabla) lo cual para cosas como un reporte son complicadas de manejar.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Arial;font-size:x-small;"&gt;Entonces la siguiente aproximaci&amp;oacute;n ser&amp;iacute;a desarrollar un procedimiento almacenado que genere la consulta y luego la una y me presente un solo resultado, algo como:&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;declare @tempTable table
(
    TableSchema nvarchar(256),
    TableName nvarchar(256),
    Cnt bigint
);

declare @sql nvarchar(4000);
declare @tableSchema nvarchar(256);
declare @tableName nvarchar(256);
declare @columnName sysname;
declare @cnt bigint;

declare tableCursor cursor for
    select TABLE_SCHEMA, TABLE_NAME from INFORMATION_SCHEMA.TABLES
    where TABLE_TYPE = &amp;#39;BASE TABLE&amp;#39;;

open tableCursor;

fetch next from tableCursor into @tableSchema, @tableName;

while @@FETCH_STATUS = 0
begin
    set @sql = &amp;#39;select @cnt = COUNT(*) from [&amp;#39; + @tableSchema + &amp;#39;].[&amp;#39; + @tableName + &amp;#39;]&amp;#39;;

    exec sp_executesql @sql, N&amp;#39;@cnt bigint output&amp;#39;, @cnt = @cnt output;

    insert into @tempTable select @tableSchema, @tableName, @cnt;

    fetch next from tableCursor into @tableSchema, @tableName;
end;

close tableCursor;
deallocate tableCursor;

select * from @tempTable;&lt;/pre&gt;
&lt;p&gt;&lt;span style="font-family:Arial;font-size:x-small;"&gt;Por supuesto esta soluci&amp;oacute;n tiene varios inconvenientes, para empezar usa un cursor para leer el listado de tablas de la consulta estandar INFORMATION_SCHEMA, segundo usa un sql din&amp;aacute;mico para armar poco a poco la consulta que se desea ejecutar y&amp;nbsp; algo que no se ve a simple vista y es la necesidad de ejecutar COUNT para cada una de las tablas, por lo cual &amp;eacute;sta no es la soluci&amp;oacute;n adecuada tampoco&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Arial;font-size:x-small;"&gt;Ahora veremos c&amp;oacute;mo podemos encontrar el conteo y de paso saber cual es la tabla que cuenta con mayor cantidad de registros&lt;/span&gt;&lt;/p&gt;
&lt;table width="100%" cellpadding="0" cellspacing="0" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td bgcolor="#000080"&gt;&lt;b&gt;&lt;span style="font-family:Arial;color:#ffffff;font-size:x-small;"&gt;Sql 2000&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td bgcolor="#000080"&gt;&lt;b&gt;&lt;span style="font-family:Arial;color:#ffffff;font-size:x-small;"&gt;Sql 2005+&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
&lt;pre&gt;SELECT OBJECT_NAME(id),rowcnt
FROM SYSINDEXES
WHERE OBJECTPROPERTY(id,&amp;rsquo;isUserTable&amp;rsquo;)=1 AND indid &amp;lt; 2
ORDER BY rowcnt DESC&lt;/pre&gt;
&lt;/td&gt;
&lt;td valign="top"&gt;
&lt;pre&gt;select sc.name +&amp;#39;.&amp;#39;+ ta.name
,sum(pa.rows) -- Valor aproximado
from sys.tables ta
inner join sys.partitions pa
on pa.object_id = ta.object_id
inner join sys.schemas sc
on ta.schema_id = sc.schema_id
where ta.is_ms_shipped = 0	AND pa.index_id IN (1,0)
group by sc.name,ta.name
ORDER BY sum(pa.rows) DESC&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;span style="font-family:Arial;font-size:x-small;"&gt;Sql Server crea estad&amp;iacute;sticas para cada tabla lo que le permite optimizar las consultas que ejecutamos por lo que podemos usar estas estad&amp;iacute;sticas para obtener &amp;eacute;ste dato, tambi&amp;eacute;n, analizar la consulta, observamos que se tiene en cuenta si la tabla est&amp;aacute; particionada y asimismo se consideran los esquemas para que la informaci&amp;oacute;n quede completa&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Espero sea de ayuda, &lt;/p&gt;
&lt;p&gt;&lt;b&gt;FREDY LEANDRO ANGARITA CASTELLANOS&lt;br /&gt;Sql Server MVP&lt;br /&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=202626" width="1" height="1"&gt;</description></item><item><title>[Code] Pivote dinámico con sql server</title><link>http://geeks.ms/blogs/fangarita/archive/2012/01/02/code-pivote-din-225-mico-con-sql-server.aspx</link><pubDate>Mon, 02 Jan 2012 15:02:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:202560</guid><dc:creator>Freddy Angarita</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fangarita/rsscomments.aspx?PostID=202560</wfw:commentRss><comments>http://geeks.ms/blogs/fangarita/archive/2012/01/02/code-pivote-din-225-mico-con-sql-server.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;Pivotes Din&amp;aacute;micos&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En muchas ocaciones tenemos informaci&amp;oacute;n en filas y queremos convertirlas en columnas, &amp;eacute;sto se presenta especialmente en escenarios de an&amp;aacute;lisis en donde tener la informaci&amp;oacute;n en colunas es un requerimiento. &lt;/p&gt;
&lt;p&gt;Revisemos el ejemplo que presenta &lt;a href="http://msdn.microsoft.com/es-co/library/ms177410.aspx"&gt;MSDN&lt;/a&gt; en su documentaci&amp;oacute;n&lt;/p&gt;
&lt;p&gt;Si tenemos una consulta:&lt;/p&gt;
&lt;pre&gt;USE AdventureWorks2008R2 ;
GO
SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost 
FROM Production.Product
GROUP BY DaysToManufacture;
&amp;nbsp;
&lt;/pre&gt;
&lt;p&gt;La cual arroja los siguiente resultados&lt;/p&gt;
&lt;p&gt;
&lt;table width="100%" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td bgcolor="#000080"&gt;&lt;b&gt;&lt;span style="color:#ffffff;"&gt;DaysToManufacture&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td bgcolor="#000080"&gt;&lt;b&gt;&lt;span style="color:#ffffff;"&gt;AverageCost &lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a&gt;0&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a&gt;5.0885&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a&gt;1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a&gt;223.88&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a&gt;2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a&gt;359.1082&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;949.4105&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;y queremos verla en columnas&lt;/p&gt;
&lt;p&gt;
&lt;table width="100%" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td bgcolor="#000080"&gt;&lt;b&gt;&lt;span style="color:#ffffff;"&gt;Cost_Sorted_By_Production_Days&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td bgcolor="#000080"&gt;&lt;b&gt;&lt;span style="color:#ffffff;"&gt;0&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td bgcolor="#000080"&gt;&lt;b&gt;&lt;span style="color:#ffffff;"&gt;1&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td bgcolor="#000080"&gt;&lt;b&gt;&lt;span style="color:#ffffff;"&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td bgcolor="#000080"&gt;&lt;b&gt;&lt;span style="color:#ffffff;"&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td bgcolor="#000080"&gt;&lt;b&gt;&lt;span style="color:#ffffff;"&gt;4&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AverageCost&lt;/td&gt;
&lt;td&gt;5.0885&lt;/td&gt;
&lt;td&gt;223.88&lt;/td&gt;
&lt;td&gt;359.1082&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;949.4105&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;Debemos usar PIVOT&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;SELECT &amp;#39;AverageCost&amp;#39; AS
Cost_Sorted_By_Production_Days, [0], [1], [2], [3], [4]
FROM
(SELECT DaysToManufacture, StandardCost FROM Production.Product) AS SourceTable&lt;br /&gt;
PIVOT
(AVG(StandardCost)
FOR DaysToManufacture IN ([0], [1], [2], [3], [4])
) AS PivotTable;&lt;br /&gt;
&lt;/pre&gt;
&lt;p&gt;Revisando la sintaxis de la consulta tenemos que debemos definir una a una las columnas que deseamos obtener con la consulta y que &amp;eacute;stas correspondan al Valor que queremos poner en esa columna, es decir, para cero (0) d&amp;iacute;as de manufactura debemos crear una columan con el nombre 0 para que se asocie el valor que se tiene para esa columna, y se observa tambi&amp;eacute;n que se debe incluir una funci&amp;oacute;n de agregaci&amp;oacute;n para crear un contexto para cada celda en el momento de poner el valor en la columna, esto es clave para poder generar el pivote.&lt;/p&gt;
&lt;p&gt;Si se ha trabajado anteriormente con tablas din&amp;aacute;micas se ver&amp;aacute; que el comportamiento es similar tan solo debemos escribir nosotros mismos la consulta&lt;/p&gt;
&lt;p&gt;EN SQL 2000&lt;/p&gt;
&lt;p&gt;Ac&amp;aacute; tenemos una idea de c&amp;oacute;mo se podr&amp;iacute;a solucionar en Sql 2000, algunas de las funciones que se presentan en &amp;eacute;sta soluci&amp;oacute;n pronto ser&amp;aacute; descontinuadas en las futuras versiones de SQL &lt;/p&gt;
&lt;pre&gt;use AdventureWorks2008R2;
go

SELECT  
  [No. Sales per year]=CASE WHEN row IS NULL THEN &amp;#39;Sum&amp;#39;  
                   ELSE CONVERT(VARCHAR(80),[row]) END , 
  [1996] =SUM( CASE col WHEN &amp;#39;2005&amp;#39; THEN data ELSE 0 END ), 
  [1997] =SUM( CASE col WHEN &amp;#39;2006&amp;#39; THEN data ELSE 0 END ), 
  [1998] =SUM( CASE col WHEN &amp;#39;2007&amp;#39; THEN data ELSE 0 END ), 
  [Total]= SUM( data ) 
FROM  
   (SELECT [row]=P.firstname+&amp;#39; &amp;#39;+ P.lastname,  
           [col]=YEAR(SOH.OrderDate),  
           [data]=COUNT(*) 
    FROM Sales.SalesPerson SP INNER JOIN Sales.SalesOrderHeader SOH ON (SP.BusinessEntityID=SOH.SalesPersonID)  
    inner join HumanResources.Employee E ON SP.BusinessEntityID = E.BusinessEntityID 
    inner join Person.Person P ON E.BusinessEntityID = P.BusinessEntityID 
    GROUP BY P.firstname+&amp;#39; &amp;#39;+ P.lastname, YEAR(SOH.OrderDate) 
    )f 
GROUP BY row WITH ROLLUP 
ORDER BY GROUPING(row),total DESC
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;IDEAS&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Siempre que aprendemos algo se nos ocurren mas ideas, tales como: Qu&amp;eacute; pasa si se tienen d&amp;iacute;as de manufactura diferentes? qu&amp;eacute; pasa si quiero una columna para cada uno de esos d&amp;iacute;as, que pasa si lo hacemos por producto? por pais? qu&amp;eacute; pasa si cada uno de ellos tiene un comportamiento diferente?&lt;/p&gt;
&lt;p&gt;Muchas de esas preguntas se responden realizando un pivote con columnas din&amp;aacute;micas, es decir, al contrario de la sintaxis normal en donde debemos definir cada columna, que se interprete y de obtengan todas las columnas que necesito sin necesidad de definirlas una a una&lt;/p&gt;
&lt;p&gt;&lt;b&gt;CONSULTA DIN&amp;Aacute;MICA&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;use AdventureWorks2008R2;
go

declare @columnas varchar(max)

set @columnas = &amp;#39;&amp;#39;

select @columnas =  coalesce(@columnas + &amp;#39;[&amp;#39; + cast(DaysToManufacture as varchar(12)) + &amp;#39;],&amp;#39;, &amp;#39;&amp;#39;)
FROM (select distinct DaysToManufacture from Production.Product) as DTM

set @columnas = left(@columnas,LEN(@columnas)-1)

DECLARE @SQLString nvarchar(500);

set @SQLString = N&amp;#39;
SELECT *
FROM
(SELECT DaysToManufacture, StandardCost 
    FROM Production.Product) AS SourceTable
PIVOT
(
AVG(StandardCost)
FOR DaysToManufacture IN (&amp;#39; + @columnas + &amp;#39;)
) AS PivotTable;&amp;#39;

EXECUTE sp_executesql @SQLString
&lt;/pre&gt;
&lt;p&gt;Pero esta soluci&amp;oacute;n tiene el inconveniente de tener que lidiar con consultas Ad-Hoc (Din&amp;aacute;micas) que asocian posibles problemas de seguridad y rendimiento a la soluci&amp;oacute;n, esta soluci&amp;oacute;n as&amp;iacute; como la dem&amp;aacute;s que se puedan implementar debe considerar d&amp;oacute;nde se van a usar, posiblemente sea mas eficiente realizar el pivote en reporting services (Matriz) que en Sql, esto debe evaluarse para cada y depende de lo que se quiera realizar&lt;/p&gt;
&lt;p&gt;&lt;b&gt;OPCION CTE - Nombres de columna din&amp;aacute;micos&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Para 2005 o superior existe una alternativa para facilitar, mas no soluciona del todo el problema y es crear una consulta que asigna valores (n&amp;uacute;meros a las columnas) facilitando la construcci&amp;oacute;n final de la consulta. En este caso queremos pivotear por el nombre del mes, pero supongamos que el rango que damos en la primera consulta cambia, entonces los nombre de las columnas (Nombre del mes) no podr&amp;iacute;an ser usados. &lt;/p&gt;
&lt;p&gt;Por ejemplo si enviamos como par&amp;aacute;metro el primero de agosto,&amp;nbsp; hasta el 31 de diciembre o si enviamos el 1 de enero al 30 de junio, tendr&amp;iacute;amos que cambiar constantemente la consulta o presentar todos los meses, para solucionar esto tenemos el siguiente ejemplo&lt;/p&gt;
&lt;pre&gt;use AdventureWorksDW2008R2;
go

;With monthyears as (
SELECT DISTINCT SpanishMonthName as CalendarMonthYearName, MonthNumberOfYear as MonthOfYear,CalendarYear
      FROM dbo.DimDate 
      WHERE DateKey &amp;gt; @FechaInicio AND DateKey &amp;lt; @FechaFinal
),
CalMonthYears AS
(
SELECT CalendarMonthYearName AS &amp;#39;CalendarMonthYearName&amp;#39;,
      MonthOfYear,
      CalendarYear,
      &lt;b&gt;ROW_NUMBER() OVER (ORDER BY CalendarYear DESC) AS &amp;#39;YearMonthNum&amp;#39;&lt;/b&gt;  
      FROM monthyears
)
SELECT ProductKey,
      [1],[2],[3],[4],[5],[6]
FROM
(
-- your query to get your data, pivot this data
SELECT YearMonthNum,s.ProductKey,
      SUM(OrderQuantity) AS &amp;#39;Quantity&amp;#39;
      FROM FactResellerSales s
      INNER JOIN dbo.DimDate d ON s.OrderDateKey = d.DateKey
      INNER JOIN CalMonthYears cmy ON d.SpanishMonthName = cmy.CalendarMonthYearName
GROUP BY YearMonthNum,s.ProductKey
) AS SourceTable
PIVOT
(
SUM(Quantity)
FOR YearMonthNum IN (
     &lt;b&gt; [1],[2],[3],[4],[5],[6]&lt;/b&gt;
      )
) AS PivotTable&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Espero sea de ayuda,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;FREDY LEANDRO ANGARITA CASTELLANOS&lt;br /&gt;Sql Server MVP&lt;br /&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=202560" width="1" height="1"&gt;</description></item><item><title>[Code] Calcular Edad a cualquier fecha</title><link>http://geeks.ms/blogs/fangarita/archive/2011/10/03/code-calcular-edad-a-cualquier-fecha.aspx</link><pubDate>Tue, 04 Oct 2011 00:36:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:200980</guid><dc:creator>Freddy Angarita</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fangarita/rsscomments.aspx?PostID=200980</wfw:commentRss><comments>http://geeks.ms/blogs/fangarita/archive/2011/10/03/code-calcular-edad-a-cualquier-fecha.aspx#comments</comments><description>&lt;p&gt;Este problema normalmente se soluciona del lado del cliente (Reporte, Aplicaci&amp;oacute;n) pero algunas ocaciones necesitamos presentarlo en algunas consultas por lo que la siguiente funci&amp;oacute;n puede ser pr&amp;aacute;ctica en varios escenarios&lt;/p&gt;
&lt;p&gt;Tomemos como ejemplo las siguientes fechas (obs&amp;eacute;rvese especialmente la &amp;uacute;ltima fecha que muestra el n&amp;uacute;mero de d&amp;iacute;a siguiente, diez a&amp;ntilde;os) y veamos c&amp;oacute;mo las funciones tradicionales muestran la diferencia en a&amp;ntilde;os, pero el c&amp;aacute;lculo no es correcto para la edad del usuario, incluso en la segunda aproximaci&amp;oacute;n tratando de solucionarlo por meses tampoco obtenemos el resultado esperado.&lt;span style="color:#0000ff;"&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="color:#0000ff;"&gt;declare &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;@Fechas &lt;span style="color:#0000ff;"&gt;table &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;FechaNacimiento &lt;span style="color:#0000ff;"&gt;date&lt;/span&gt;&lt;span style="color:#808080;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;declare&lt;/span&gt; @hoy &lt;span style="color:#0000ff;"&gt;date&lt;br /&gt;set&lt;/span&gt; @hoy &lt;span style="color:#808080;"&gt;=&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;GETDATE&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;insert&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;into&lt;/span&gt; @Fechas &lt;span style="color:#0000ff;"&gt;values &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;#39;1978-05-20&amp;#39;&lt;/span&gt;&lt;span style="color:#808080;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;insert&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;into&lt;/span&gt; @Fechas &lt;span style="color:#0000ff;"&gt;values &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;#39;1963-01-14&amp;#39;&lt;/span&gt;&lt;span style="color:#808080;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;insert&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;into&lt;/span&gt; @Fechas &lt;span style="color:#0000ff;"&gt;values &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;DATEADD&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;yyyy&lt;span style="color:#808080;"&gt;,-&lt;/span&gt;10&lt;span style="color:#808080;"&gt;,&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;DATEADD&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;dd&lt;span style="color:#808080;"&gt;,&lt;/span&gt;1&lt;span style="color:#808080;"&gt;,&lt;/span&gt;@hoy&lt;span style="color:#808080;"&gt;)))&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;select&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;span style="color:#808080;"&gt;*&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; @Fechas &lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="color:#0000ff;"&gt;
&lt;p&gt;select &lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;DATEDIFF&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;yyyy&lt;span style="color:#808080;"&gt;,&lt;/span&gt;FechaNacimiento&lt;span style="color:#808080;"&gt;,&lt;/span&gt; @hoy&lt;span style="color:#808080;"&gt;),&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;cast&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;DATEDIFF&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;mm&lt;span style="color:#808080;"&gt;,&lt;/span&gt; FechaNacimiento&lt;span style="color:#808080;"&gt;,&lt;/span&gt; @hoy&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;decimal&lt;/span&gt;&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#808080;"&gt;/&lt;/span&gt; 12 &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; @Fechas&lt;/p&gt;
&lt;p&gt;Obtendremos resultados como (dependiendo de la fecha en que se ejecute el script, dado que toma la fecha actual del sistema):&lt;/p&gt;
&lt;p&gt;
&lt;table width="100%" border="0" style="BORDER-COLLAPSE:collapse;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td bgcolor="#808080"&gt;&lt;b&gt;Edad Esperada&lt;/b&gt;&lt;/td&gt;
&lt;td bgcolor="#808080"&gt;&lt;b&gt;Diferencia A&amp;ntilde;os&lt;/b&gt;&lt;/td&gt;
&lt;td bgcolor="#808080"&gt;&lt;b&gt;Diferencia Meses&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;33.416666&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;48.750000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;10.000000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;Ahora la soluci&amp;oacute;n propuesta para &amp;eacute;ste problema es crear una funci&amp;oacute;n que lo resuelva retornando el valor adecuado, incluso para fechas diferentes a la actual (se puede enviar como par&amp;aacute;metro la fecha a la que quiero calcular la edad)&lt;span style="color:#0000ff;"&gt;&lt;span style="color:#0000ff;"&gt; &lt;span style="color:#0000ff;"&gt;&lt;span style="color:#0000ff;"&gt;
&lt;p&gt;create&amp;nbsp;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; ObtenerEdad&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@FechaNacimiento &lt;span style="color:#0000ff;"&gt;date&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; @AFecha &lt;span style="color:#0000ff;"&gt;date&lt;/span&gt; &lt;span style="color:#808080;"&gt;=&lt;/span&gt; &lt;span style="color:#808080;"&gt;null)&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;returns&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;br /&gt;Begin&lt;br /&gt;&lt;br /&gt;declare&lt;/span&gt; @hoy &lt;span style="color:#0000ff;"&gt;date&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; @Edad &lt;span style="color:#0000ff;"&gt;int&lt;br /&gt;if&lt;/span&gt; @hoy &lt;span style="color:#808080;"&gt;is&lt;/span&gt; &lt;span style="color:#808080;"&gt;null&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; @hoy &lt;span style="color:#808080;"&gt;=&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;GETDATE&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; @hoy &lt;span style="color:#808080;"&gt;=&lt;/span&gt; @AFecha&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="color:#0000ff;"&gt;
&lt;p&gt;set&amp;nbsp;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;@Edad &lt;span style="color:#808080;"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;CASE&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;WHEN&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;MONTH&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@FechaNacimiento&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#808080;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;MONTH&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@hoy&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;THEN &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;YEAR&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@hoy&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;-&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;YEAR&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@FechaNacimiento&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#808080;"&gt;-&lt;/span&gt; 1&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;WHEN&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;MONTH&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@hoy&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#808080;"&gt;=&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;MONTH&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@FechaNacimiento&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;AND&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;DAY&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@FechaNacimiento&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#808080;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;DAY&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@hoy&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;THEN&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;YEAR&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@hoy&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#808080;"&gt;-&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;YEAR&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@FechaNacimiento&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;-&lt;/span&gt; 1 &lt;span style="color:#0000ff;"&gt;ELSE&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;YEAR&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@hoy&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#808080;"&gt;-&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;YEAR&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@FechaNacimiento&lt;span style="color:#808080;"&gt;) &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;END&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; @Edad&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;End&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;go&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/span&gt;Si intento de nuevo con los valores ingresados inicialmente obtenendr&amp;eacute; la edad correcta en cada caso &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;select &lt;/span&gt;dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;ObtenerEdad&lt;span style="color:#808080;"&gt;(&lt;/span&gt;FechaNacimiento&lt;span style="color:#808080;"&gt;) as Edad, &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;DATEDIFF&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;yyyy&lt;span style="color:#808080;"&gt;,&lt;/span&gt;FechaNacimiento&lt;span style="color:#808080;"&gt;,&lt;/span&gt; @hoy&lt;span style="color:#808080;"&gt;),&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;cast&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;DATEDIFF&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;mm&lt;span style="color:#808080;"&gt;,&lt;/span&gt; FechaNacimiento&lt;span style="color:#808080;"&gt;,&lt;/span&gt; @hoy&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;decimal&lt;/span&gt;&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#808080;"&gt;/&lt;/span&gt; 12&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; @Fechas&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;&lt;span style="font-size:x-small;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size:x-small;"&gt;Espero sea de ayuda,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:x-small;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:x-small;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:x-small;"&gt;&lt;/span&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;FREDY LEANDRO ANGARITA CASTELLANOS&lt;br /&gt;Sql Server MVP&lt;br /&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=200980" width="1" height="1"&gt;</description></item><item><title>[Code] Cómo numerar filas en SSIS</title><link>http://geeks.ms/blogs/fangarita/archive/2011/09/26/code-c-243-mo-numerar-filas-en-ssis.aspx</link><pubDate>Mon, 26 Sep 2011 20:19:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:200752</guid><dc:creator>Freddy Angarita</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fangarita/rsscomments.aspx?PostID=200752</wfw:commentRss><comments>http://geeks.ms/blogs/fangarita/archive/2011/09/26/code-c-243-mo-numerar-filas-en-ssis.aspx#comments</comments><description>&lt;p&gt;Numerar Filas puede ser de gran ayuda para crear l&amp;oacute;gica en SSIS, para generarlas se pueden seguir los siguientes pasos&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Agregar un DataFLow Task&lt;/li&gt;
&lt;li&gt;Agregar un Origen de datos con una consulta a la que le queramos generar los n&amp;uacute;meros de fila&lt;/li&gt;
&lt;li&gt;Agregar un Script Component Agregar una Columna de Salida Llamada (para el ejemplo) &lt;em&gt;Numero&lt;/em&gt;, con un c&amp;oacute;digo similar al presentado a continuaci&amp;oacute;n:&lt;br /&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;
&lt;p&gt;public&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;span style="font-size:x-small;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; &lt;/span&gt;&lt;span style="color:#2b91af;font-size:x-small;"&gt;&lt;span style="color:#2b91af;font-size:x-small;"&gt;ScriptMain&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; : &lt;/span&gt;&lt;span style="color:#2b91af;font-size:x-small;"&gt;&lt;span style="color:#2b91af;font-size:x-small;"&gt;UserComponent&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:x-small;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;private&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; _RowNumber = 0;&lt;/span&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:x-small;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;override&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;void&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; Input0_ProcessInputRow(&lt;/span&gt;&lt;span style="color:#2b91af;font-size:x-small;"&gt;&lt;span style="color:#2b91af;font-size:x-small;"&gt;Input0Buffer&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; Row)&lt;br /&gt;{&lt;br /&gt;_RowNumber++;&lt;br /&gt;Row.Numero1 = _RowNumber;&lt;/span&gt;&lt;span style="font-size:x-small;"&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;El c&amp;oacute;diigo generar&amp;aacute; el n&amp;uacute;mero de fila de acuerdo al ordenamiento actual&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style="font-size:x-small;"&gt;Se podr&amp;aacute; repetir el paso 3 para agregar el n&amp;uacute;mero de ordenamientos que sea necesario&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style="font-size:x-small;"&gt;Se agrega un paquete de ejemplo para realizar &amp;eacute;sta tarea y como parte del ejemplo se distribuyen los productos en pares e impares &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:x-small;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:x-small;"&gt;Espero sea de ayuda,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:x-small;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:x-small;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:x-small;"&gt;
&lt;p&gt;&lt;b&gt;FREDY LEANDRO ANGARITA CASTELLANOS&lt;br /&gt;Sql Server MVP&lt;br /&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=200752" width="1" height="1"&gt;</description><enclosure url="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.20.07.52/NumerarFilas.zip" length="28001" type="application/x-zip-compressed" /></item><item><title>[Info] Contadores de Rendimiento para diagnóstico y afinación de SqlServer</title><link>http://geeks.ms/blogs/fangarita/archive/2011/09/10/info-contadores-de-rendimiento-para-diagn-243-stico-y-afinaci-243-n-de-sqlserver.aspx</link><pubDate>Sat, 10 Sep 2011 21:46:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:200429</guid><dc:creator>Freddy Angarita</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fangarita/rsscomments.aspx?PostID=200429</wfw:commentRss><comments>http://geeks.ms/blogs/fangarita/archive/2011/09/10/info-contadores-de-rendimiento-para-diagn-243-stico-y-afinaci-243-n-de-sqlserver.aspx#comments</comments><description>&lt;p&gt;A continuaci&amp;oacute;n presento alguno de los contadores de rendimiento, pertenecientes a la instrumentaci&amp;oacute;n de SqlServer que ayudan al proceso de diagn&amp;oacute;stico y optimizaci&amp;oacute;n de SqlServer&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Performance.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Performance.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Performance-Counter.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Performance-Counter.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/Performance-Counter.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;En el gr&amp;aacute;fico se presenta el grupo de contadores de rendimiento, luego al abrirlo se presenta cada contador independiente y luego en la parte de abajo (si aplica) que es lo q se quiere medir&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Procesador&lt;/strong&gt; 
&lt;table width="100%" border="1" style="border-collapse:collapse;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Processor&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td width="1"&gt;Esperado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;%User Time&lt;/td&gt;
&lt;td&gt;SqlServer se ejecuta en modo de Usuario. El modo privilegiado es usado por el Sistema operativo para acceder a los componentes de hardware. Este componente deber&amp;iacute;a presentar un valor mayor de 70%, si el valor es menor que esto se deben revisar los indicadores %privileged time y %processor time para verificar si existe alg&amp;uacute;n tipo de problema con el procesador&lt;/td&gt;
&lt;td width="1"&gt;&amp;gt;70%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;%Privileged Time&lt;/td&gt;
&lt;td&gt;El sistema operativo mueve los hilos al modo de acceso privilegiado para acceder servicios de Hardware. Este contador debe tener un valor menor a 20%.&lt;/td&gt;
&lt;td width="1"&gt;&amp;lt;20%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;%Processor Time&lt;/td&gt;
&lt;td&gt;Presenta el porcentaje de tiempo usado por la CPU en un periodo de tiempo. Idealmente debe ser menor que 70%.&lt;/td&gt;
&lt;td width="1"&gt;&amp;lt;70%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Interrupts/Sec&lt;/td&gt;
&lt;td&gt;Es el promedio de incidentes por segundo, al cual el procesador recibi&amp;oacute; y proces&amp;oacute; interrupciones de Hardware&lt;/td&gt;
&lt;td width="1"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;table width="100%" border="1" style="border-collapse:collapse;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;System&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Esperado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Processor Queue Length&lt;/td&gt;
&lt;td&gt;Es el n&amp;uacute;mero de hilos que espearan a ser procesados. Este contador por valor general divido por el n&amp;uacute;mero de n&amp;uacute;cleos disponibles. Deber&amp;iacute;a ser menor que 2&lt;/td&gt;
&lt;td&gt;&amp;lt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disco&lt;/strong&gt;&lt;/p&gt;
&lt;table width="100%" border="1" style="border-collapse:collapse;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Physical Disk&lt;/td&gt;
&lt;td width="80%"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td width="1"&gt;Esperado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Current Queue Length&lt;/td&gt;
&lt;td width="80%"&gt;Un tama&amp;ntilde;o sostenido de una cola de disco presenta un posible problema con el subsistema de I/O.&lt;/td&gt;
&lt;td width="1"&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average Queue Length&lt;/td&gt;
&lt;td width="80%"&gt;Si el promedio de longitud de la cola es mayor que 2 indica que existe un problema potencial con el subsistea de IO, esto tambien puede deberse a un indicador disk sec/read y disk sec/write alto.&lt;/td&gt;
&lt;td width="1"&gt;&amp;lt;=2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disk Sec/Read
&lt;p&gt;Disk Sec/Writes&lt;/p&gt;
&lt;/td&gt;
&lt;td width="80%"&gt;Ninguno de estos contadores deber&amp;iacute;a tener un valor superior a 15ms en condiciones normales. Valores continuos sobre 20ms puede indicar un problema en el disco o sobrecarga del sistema o alto fraccionamiento del disco.
&lt;p&gt;Bajo estas condiciones se pueden considerar las siguientes alternativas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mover los archivos de base de datos a discos adicionales&lt;/li&gt;
&lt;li&gt;Crear grupos de archivos en diferentes discos y pasar algunas tablas a cada uno de esos discos&amp;nbsp; (pueden tener difernte RAID) lo cual puede influir notablemente en el desempe&amp;ntilde;o&lt;/li&gt;
&lt;li&gt;Revisar los &amp;iacute;ndices de las tablas&lt;/li&gt;
&lt;li&gt;Revisar los contadores de CPU y memoria con el fin de identificar otros cuellos de Botella&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td width="1"&gt;&amp;lt;=15&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;Memory/Cache&lt;/b&gt;&lt;/p&gt;
&lt;table width="100%" border="1" style="border-collapse:collapse;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Memory&lt;/td&gt;
&lt;td width="80%"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Page Faults/Sec:&lt;/td&gt;
&lt;td width="80%"&gt;Los fallos de p&amp;aacute;gina ocurren cuando se busca una p&amp;aacute;gina en memoria y no se encuentra. Existen 2 tipos de fallos de p&amp;aacute;gina:
&lt;p&gt;&lt;a name="Fuertes_(Hard)_"&gt;Fuertes (Hard) &lt;/a&gt;: Requiere acceso a disco&lt;/p&gt;
&lt;p&gt;Suaves (Soft).&amp;nbsp; La p&amp;aacute;gina buscada est&amp;aacute; en alguna otra parte de la memoria&lt;/p&gt;
&lt;p&gt;Un alto n&amp;uacute;mero de fallos de p&amp;aacute;gina por segundo indica que existe un problema con la memoria usada por Sql Server. Usando este contador junto con SqlServer:MemoryManager se puede determinar si existe algun tipo de presi&amp;oacute;n sobre la memoria&lt;/p&gt;
&lt;p&gt;Bajo estas condiciones puede considerarse:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Revisar los procedimientos y las pr&amp;aacute;cticas usadas para el desarrollo de los mismos&lt;/li&gt;
&lt;li&gt;Aumentar la memoria del servidor &lt;/li&gt;
&lt;li&gt;Revisar el espacio en disco disponible en donde se ubiquen los temporales del sistema operativo&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Pages/Sec&lt;/td&gt;
&lt;td width="80%"&gt;Este contador es valor real de fallos &lt;a href="http://geeks.ms/controlpanel/blogs/posteditor.aspx?SelectedNavItem=NewPost#Fuertes_(Hard)_"&gt;Fuertes de p&amp;aacute;ginas&lt;/a&gt; y debe ser usado en correlaci&amp;oacute;n con Page Faults/Sec y SQL Server memory Manager para revisar la presi&amp;oacute;n sobre la memoria&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;SQL Server&lt;/strong&gt;&lt;/p&gt;
&lt;table width="100%" border="1" style="border-collapse:collapse;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Access Methods&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Forwarded Records/Sec&lt;/td&gt;
&lt;td&gt;Numero de registros tra&amp;iacute;dos usando punteros de registros, es decir, cuando los registros tienen espacios vac&amp;iacute;os entre ellos o cuando el tama&amp;ntilde;o del registro no queda ajustado al tama&amp;ntilde;o de una p&amp;aacute;gina, esta situaci&amp;oacute;n puede presentarse cuando se inicia con un registro corto y se actualiza el dato quedando parte de &amp;eacute;ste en otra p&amp;aacute;gina lo que requiere la generaci&amp;oacute;n de un puntero para saber en qu&amp;eacute; lugar est&amp;aacute; la otra parte del registro.
&lt;p&gt;Esto se puede evitar siguiendo los siguientes pasos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ser cuidadoso al determinar cuales de las columnas permiten o no nulos&lt;/li&gt;
&lt;li&gt;Usar valores por defecto (para evitar el uso de nulos)&lt;/li&gt;
&lt;li&gt;Usar char en lugar de Varchar cuando sea posible&lt;/li&gt;
&lt;li&gt;Manejar un esquema de normalizaci&amp;oacute;n en donde el n&amp;uacute;mero de campos sea menos (Soluciones OLTP)&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Full Scans/Sec&lt;/td&gt;
&lt;td&gt;Se realiza una lectura completa de una Tabla o de un &amp;iacute;ndice. Esto puede ser causado por el uso indebido de &amp;iacute;ndices.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Page Splits/Sec&lt;/td&gt;
&lt;td&gt;Fraccionamiento sobre las p&amp;aacute;ginas de los &amp;iacute;ndices. Este indicador est&amp;aacute; asociado a las p&amp;aacute;ginas hoja del Arbol de &amp;iacute;ndices que no se almacenan conitnuamente lo que lleva a su fraccionamiento en disco. Esto se puede evitar configurando apropiadamente &lt;a href="http://geeks.ms/controlpanel/blogs/posteditor.aspx?SelectedNavItem=NewPost#Fill_Factor"&gt;Fill Factor&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;table width="100%" border="1" style="border-collapse:collapse;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Memory Manager&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Memory Grants Pending&lt;/td&gt;
&lt;td&gt;Memoria que se necesita para procesar cada una de las peticiones de los usuarios. Si no se dispone de memoria suficiente entonces el proceso debe esperar a que se le sea asignada para su ejecuci&amp;oacute;n, lo que por supuesto impacta el desempe&amp;ntilde;o de la consulta o procedimiento en ejecuci&amp;oacute;n
&lt;p&gt;Para evitarlo se pueden seguir los siguientes pasos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Agregar mas memoria al servidor&lt;/li&gt;
&lt;li&gt;Asignando mas memoria a SqlServer&lt;/li&gt;
&lt;li&gt;Creando &amp;Iacute;ndices apropiados&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table width="100%" border="1" style="border-collapse:collapse;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Buffer Manager&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Esperado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Buffer Cache Hit Ratio&lt;/td&gt;
&lt;td&gt;Porcentaje del tiempo en que las p&amp;aacute;ginas solicitadas est&amp;aacute;n ya en memoria. Idealmente debe mantenerse sobre 99%, si es menor que 95% indica que SqlServer no tiene suficiente memoria y que agregar m&amp;aacute;s memoria al servidor, asignada a SqlServer, ser&amp;iacute;a muy beficioso&lt;/td&gt;
&lt;td&gt;&amp;gt;99%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Checkpoints/Sec&lt;/td&gt;
&lt;td&gt;Paginas escritas a disco durante el proceso de &lt;a href="http://geeks.ms/controlpanel/blogs/posteditor.aspx?SelectedNavItem=NewPost#CheckPoints"&gt;CheckPoint&lt;/a&gt;. Se identifica presi&amp;oacute;n sobre la memoria si el contador tiene un valor superior a 300 Segundos&lt;/td&gt;
&lt;td&gt;&amp;lt;300s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Lazy Writes/Sec&lt;/td&gt;
&lt;td&gt;Paginas escritas a disco durante el proceso &lt;a href="http://geeks.ms/controlpanel/blogs/posteditor.aspx?SelectedNavItem=NewPost#Lazy_Writer"&gt;LazyWriter&lt;/a&gt; (Escribe las p&amp;aacute;ginas en segundo plano al disco). Se identifica presi&amp;oacute;n sobre la memoria si el contador tiene un valor superior a 300 Segundos&lt;/td&gt;
&lt;td&gt;&amp;lt;300s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Page Life Expectancy&lt;/td&gt;
&lt;td&gt;Este es uno de los principales contadores para identificar presi&amp;oacute;n sobre la memoria. Determina el tiempo en segundos en el que la p&amp;aacute;gina reside en el Cach&amp;eacute; de SqlServer. Si el valor es bajo indica los siguientes problemas: 
&lt;ul&gt;
&lt;li&gt;El Cach&amp;eacute; es Frio (Revisar informaci&amp;oacute;n sobre Fallos de P&amp;aacute;gina Page Faults)&lt;/li&gt;
&lt;li&gt;Problemas de Memoria&lt;/li&gt;
&lt;li&gt;Falta de creaci&amp;oacute;n de &amp;iuml;ndices&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si Checkpoints/Sec, Lazy Writes/Sec y Page life expectancy juntos es menor a 300 Segundos entonces indica que la causa es la falta de memoria y que se debe agregar m&amp;aacute;s memoria al servidor&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table width="100%" border="1" style="border-collapse:collapse;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Databases&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Transactions/Sec&lt;/td&gt;
&lt;td&gt;Indica el n&amp;uacute;mero de transacciones que ocurren por sengundo en el servidor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table width="100%" border="1" style="border-collapse:collapse;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;General StatisticsCounters&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;User Connections&lt;/td&gt;
&lt;td&gt;N&amp;uacute;mero de conexiones hechas a SqlServer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table width="100%" border="1" style="border-collapse:collapse;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Latches&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Average Latch wait Time&lt;/td&gt;
&lt;td&gt;Son objetos livianos de sincronizaci&amp;oacute;n. No se mantienen durante la duraci&amp;oacute;n de la transacci&amp;oacute;n. T&amp;iacute;picamente se usan cuando se transfieren filas a memoria, mientras se contolan modificaciones a las filas, etc.
&lt;p&gt;Un valor alto puede indicar alg&amp;uacute;n problema con el subsistema de Memoria&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table width="100%" border="1" style="border-collapse:collapse;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Locks&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="20%"&gt;Average Wait Time(ms)&lt;br /&gt;Lock Wait time(ms)&lt;br /&gt;Lock waits/Sec&lt;/td&gt;
&lt;td&gt;Los contadores relacionados a los bloqueos que mantiene SqlServer en un momento determinado de las transacciones. Las transacciones deben ser tan cortas como sea posible y por lo tanto deber&amp;iacute;a mantener bloqueos la menor cantidad de tiempo posible para evitar para bloqueos a otros usaurios o procesos. Un Valor alto para cualquiera de estos contadores indica: 
&lt;ul&gt;
&lt;li&gt;Presi&amp;oacute;n sobre la memoria&lt;/li&gt;
&lt;li&gt;Problemas con el Disco&lt;/li&gt;
&lt;li&gt;&amp;Iacute;ndices inadecuados&lt;/li&gt;
&lt;li&gt;Dise&amp;ntilde;o inadecuado de tablas u objetos de SqlServer&lt;/li&gt;
&lt;li&gt;Inadecuada ubicaci&amp;oacute;n de los archivos de base de datos &lt;/li&gt;
&lt;li&gt;Uso indebido de los niveles de aislamiento de SqlServer&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Los mencionados, son algunos de los contadores preferidos, aparte de esos pueden revisarse estos contadores:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Object Name Counter Name&lt;br /&gt;SQL Statistics Compilations/sec&lt;br /&gt;SQL Statistics Recompilations/sec&lt;br /&gt;SQL Statistics Batch Requests/sec&lt;br /&gt;SQL Server: Buffer Manager Readahead pages/sec&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Algunas Definiciones&lt;/b&gt;&lt;/p&gt;
&lt;hr align="left" /&gt;
&lt;p&gt;&lt;a name="P&amp;aacute;ginas_Sucias"&gt;P&amp;aacute;ginas Sucias&lt;/a&gt;: P&amp;aacute;ginas que han entrado al cach&amp;eacute; y han sido modificadas, pero aun no se han escrito a disco. &lt;/p&gt;
&lt;p&gt;&lt;a name="CheckPoints"&gt;CheckPoints&lt;/a&gt;: Escribe todas las p&amp;aacute;ginas sucias a disco. Crea un punto al cual se garantiza que todas las p&amp;aacute;ginas han sido escritas a disco&lt;/p&gt;
&lt;p&gt;&lt;a name="Fill_Factor"&gt;Fill Factor&lt;/a&gt;: Factor por el cual crecen los archivos de base datos, cuando se espera una gran cantidad de nuevos registros en la base de datos se debe establecer un FillFactor alto con el fin que los datos no queden fragmentados y un FillFactor un poco menor en caso de ser utilizada en procesos de actualizaci&amp;oacute;n y solo consulta&lt;/p&gt;
&lt;p&gt;&lt;a name="Lazy_Writer"&gt;Lazy Writer&lt;/a&gt;:&amp;nbsp; es un proceso que elimina conjuntos de buffers viejos y no usaados de memoria (Los buffers que tienen cambios deben ser escritos de nuevo al disco antes que el buffer pueda ser reusado para una p&amp;aacute;gina diferente). &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Espero sea de ayuda&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;FREDY LEANDRO ANGARITA CASTELLANOS&lt;br /&gt;Sql Server MVP&lt;br /&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=200429" width="1" height="1"&gt;</description></item><item><title>[Code] Cómo detectar los grupos de archivos que tiene cada tabla en la base de datos</title><link>http://geeks.ms/blogs/fangarita/archive/2011/09/07/code-c-243-mo-detectar-los-grupos-de-archivos-que-tiene-cada-tabla-en-la-base-de-datos.aspx</link><pubDate>Wed, 07 Sep 2011 22:57:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:200394</guid><dc:creator>Freddy Angarita</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fangarita/rsscomments.aspx?PostID=200394</wfw:commentRss><comments>http://geeks.ms/blogs/fangarita/archive/2011/09/07/code-c-243-mo-detectar-los-grupos-de-archivos-que-tiene-cada-tabla-en-la-base-de-datos.aspx#comments</comments><description>&lt;p&gt;&lt;span style="font-size:x-small;"&gt;
&lt;p&gt;En el art&amp;iacute;culo en el &lt;a href="http://geeks.ms/blogs/fangarita/archive/2011/01/17/info-optimizaci-243-n-de-consultas-parte-1-generalidades.aspx" title="Optimizaci&amp;oacute;n de consultas"&gt;art&amp;iacute;culo de optimizaci&amp;oacute;n de consultas&lt;/a&gt; se menciona como uno de los procesos de optimizaci&amp;oacute;n, la asignaci&amp;oacute;n de grupos de archivos a diferentes tables para utilizar mejor el hardware del servidor y hacer de las consultas un proceso mas veloz, para determinar cual son las tablas que son candidatas para pasarlas a otros grupos de archivos podemos usar:&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; si&lt;span style="color:#808080;"&gt;.&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;rows&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;&amp;#39;ConteoFilas&amp;#39;&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; SO&lt;span style="color:#808080;"&gt;.&lt;/span&gt;Name &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;&amp;#39;Tabla&amp;#39;&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; SI&lt;span style="color:#808080;"&gt;.&lt;/span&gt;name &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;&amp;#39;Nombre Indice&amp;#39;&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; SFG&lt;span style="color:#808080;"&gt;.&lt;/span&gt;groupname &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;&amp;#39;Grupo de Archivos&amp;#39;&lt;/span&gt; &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;from &lt;/span&gt;&lt;span style="color:#008000;"&gt;sysobjects&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; SO &lt;span style="color:#808080;"&gt;join&lt;/span&gt; &lt;span style="color:#008000;"&gt;sysindexes&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; SI &lt;span style="color:#0000ff;"&gt;on &lt;/span&gt;SO&lt;span style="color:#808080;"&gt;.&lt;/span&gt;Id &lt;span style="color:#808080;"&gt;=&lt;/span&gt; SI&lt;span style="color:#808080;"&gt;.&lt;/span&gt;id &lt;span style="color:#808080;"&gt;join&lt;/span&gt; &lt;span style="color:#008000;"&gt;sysfilegroups&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; SFG &lt;span style="color:#0000ff;"&gt;on &lt;/span&gt;SI&lt;span style="color:#808080;"&gt;.&lt;/span&gt;GroupId &lt;span style="color:#808080;"&gt;=&lt;/span&gt; SFG&lt;span style="color:#808080;"&gt;.&lt;/span&gt;GroupId &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;order&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;by&lt;/span&gt; si&lt;span style="color:#808080;"&gt;.&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;rows&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;desc&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; SO&lt;span style="color:#808080;"&gt;.&lt;/span&gt;Name &lt;span style="color:#808080;"&gt;,&lt;/span&gt; SI&lt;span style="color:#808080;"&gt;.&lt;/span&gt;name&lt;span style="color:#808080;"&gt;,&lt;/span&gt; SFG&lt;span style="color:#808080;"&gt;.&lt;/span&gt;GroupName&lt;/p&gt;
&lt;p&gt;Las tablas que contengan un mayor n&amp;uacute;mero de registros son candidatas para hacer el paso a otro(s) grupos de archivo&lt;/p&gt;
&lt;span style="color:#0000ff;font-size:x-small;"&gt;
&lt;p&gt;select &lt;/p&gt;
&lt;span style="color:#0000ff;font-size:x-small;"&gt;
&lt;p&gt;&lt;span style="font-size:x-small;"&gt;Esto nos devuelte el numero de filas y nombre de la tabla y el grupo de archivos al cual pertenece, en versiones como Standard &amp;eacute;ste puede ser uno de los pasos para lograr m&amp;aacute;s velocidad en tablas de hechos, tales como movimientos y registros paso a paso&lt;/span&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:x-small;"&gt;si&lt;/span&gt;&lt;span style="color:#808080;font-size:x-small;"&gt;.&lt;/span&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;rows&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;as&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;font-size:x-small;"&gt;&amp;#39;Rows&amp;#39;&lt;/span&gt;&lt;span style="color:#808080;font-size:x-small;"&gt;,&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; SO&lt;/span&gt;&lt;span style="color:#808080;font-size:x-small;"&gt;.&lt;/span&gt;&lt;span style="font-size:x-small;"&gt;Name &lt;/span&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;as&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;font-size:x-small;"&gt;&amp;#39;Table&amp;#39;&lt;/span&gt;&lt;span style="color:#808080;font-size:x-small;"&gt;,&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; SI&lt;/span&gt;&lt;span style="color:#808080;font-size:x-small;"&gt;.&lt;/span&gt;&lt;span style="font-size:x-small;"&gt;name &lt;/span&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;as&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;font-size:x-small;"&gt;&amp;#39;Index&amp;#39;&lt;/span&gt;&lt;span style="color:#808080;font-size:x-small;"&gt;,&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; SFG&lt;/span&gt;&lt;span style="color:#808080;font-size:x-small;"&gt;.&lt;/span&gt;&lt;span style="font-size:x-small;"&gt;groupname &lt;/span&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;as&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;font-size:x-small;"&gt;&amp;#39;Filegroup&amp;#39; &lt;/span&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;from &lt;/span&gt;&lt;span style="color:#008000;font-size:x-small;"&gt;sysobjects&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;as &lt;/span&gt;&lt;span style="font-size:x-small;"&gt;SO &lt;/span&gt;&lt;span style="color:#808080;font-size:x-small;"&gt;join&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-size:x-small;"&gt;sysindexes&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;as&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; SI &lt;/span&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;on&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; SO&lt;/span&gt;&lt;span style="color:#808080;font-size:x-small;"&gt;.&lt;/span&gt;&lt;span style="font-size:x-small;"&gt;Id &lt;/span&gt;&lt;span style="color:#808080;font-size:x-small;"&gt;=&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; SI&lt;/span&gt;&lt;span style="color:#808080;font-size:x-small;"&gt;.&lt;/span&gt;&lt;span style="font-size:x-small;"&gt;id &lt;/span&gt;&lt;span style="color:#808080;font-size:x-small;"&gt;join&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-size:x-small;"&gt;sysfilegroups&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;as &lt;/span&gt;&lt;span style="font-size:x-small;"&gt;SFG &lt;/span&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;on&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; SI&lt;/span&gt;&lt;span style="color:#808080;font-size:x-small;"&gt;.&lt;/span&gt;&lt;span style="font-size:x-small;"&gt;GroupId &lt;/span&gt;&lt;span style="color:#808080;font-size:x-small;"&gt;=&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; SFG&lt;/span&gt;&lt;span style="color:#808080;font-size:x-small;"&gt;.&lt;/span&gt;&lt;span style="font-size:x-small;"&gt;GroupId&lt;/span&gt;&lt;span style="font-size:x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;order&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;by&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; si&lt;/span&gt;&lt;span style="color:#808080;font-size:x-small;"&gt;.&lt;/span&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;rows&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;font-size:x-small;"&gt;desc&lt;/span&gt;&lt;span style="color:#808080;font-size:x-small;"&gt;,&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; SO&lt;/span&gt;&lt;span style="color:#808080;font-size:x-small;"&gt;.&lt;/span&gt;&lt;span style="font-size:x-small;"&gt;Name &lt;/span&gt;&lt;span style="color:#808080;font-size:x-small;"&gt;,&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; SI&lt;/span&gt;&lt;span style="color:#808080;font-size:x-small;"&gt;.&lt;/span&gt;&lt;span style="font-size:x-small;"&gt;name&lt;/span&gt;&lt;span style="color:#808080;font-size:x-small;"&gt;,&lt;/span&gt;&lt;span style="font-size:x-small;"&gt; SFG.GroupName&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:x-small;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:x-small;"&gt;
&lt;p&gt;Espero sea de ayuda&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;FREDY LEANDRO ANGARITA CASTELLANOS&lt;br /&gt;Sql Server MVP&lt;br /&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=200394" width="1" height="1"&gt;</description></item><item><title>[Code] Cómo consultar los registros no asociados con otros registros de la misma tabla</title><link>http://geeks.ms/blogs/fangarita/archive/2011/09/06/code-c-243-mo-consultar-los-registros-no-asociados-con-otros-registros-de-la-misma-tabla.aspx</link><pubDate>Tue, 06 Sep 2011 16:24:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:200379</guid><dc:creator>Freddy Angarita</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fangarita/rsscomments.aspx?PostID=200379</wfw:commentRss><comments>http://geeks.ms/blogs/fangarita/archive/2011/09/06/code-c-243-mo-consultar-los-registros-no-asociados-con-otros-registros-de-la-misma-tabla.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;Detectar si un determinado usuario&amp;nbsp;tiene o no autorizaci&amp;oacute;n para realizar alguna tarea, detectar cuales de los &amp;iacute;tems no ha sido asociados a &amp;eacute;l es tan solo algunas de las aplicaciones para &amp;eacute;ste art&amp;iacute;culo. &lt;/p&gt;
&lt;p&gt;Como primera instancia tenemos una tabla de ejemplo, que se genera usando:&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;declare &lt;/span&gt;@t1 &lt;span style="color:#0000ff;"&gt;table &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;id &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; VALOR &lt;span style="color:#0000ff;"&gt;CHAR&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;1&lt;span style="color:#808080;"&gt;))&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="color:#0000ff;"&gt;
&lt;p&gt;insert into &lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;@t1 &lt;span style="color:#0000ff;"&gt;values &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;1&lt;span style="color:#808080;"&gt;,&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span style="color:#808080;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;insert&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;into&lt;/span&gt; @t1 &lt;span style="color:#0000ff;"&gt;values &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;2&lt;span style="color:#808080;"&gt;,&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;&lt;span style="color:#808080;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;insert&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;into&lt;/span&gt; @t1 &lt;span style="color:#0000ff;"&gt;values &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;3&lt;span style="color:#808080;"&gt;,&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;&amp;#39;C&amp;#39;&lt;/span&gt;&lt;span style="color:#808080;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;insert&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;into&lt;/span&gt; @t1 &lt;span style="color:#0000ff;"&gt;values &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;4&lt;span style="color:#808080;"&gt;,&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;&amp;#39;D&amp;#39;&lt;/span&gt;&lt;span style="color:#808080;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;insert&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;into&lt;/span&gt; @t1 &lt;span style="color:#0000ff;"&gt;values &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;5&lt;span style="color:#808080;"&gt;,&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;&amp;#39;E&amp;#39;&lt;/span&gt;&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="color:#0000ff;"&gt;
&lt;p&gt;select &lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#808080;"&gt;*&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; @t1 &lt;/p&gt;
&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table width="50%" border="1" style="border-collapse:collapse;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td bgcolor="#c0c0c0"&gt;id&lt;/td&gt;
&lt;td bgcolor="#c0c0c0"&gt;VALOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;Queremos saber por cada uno de los valores en la columna Id, cuales de los valores en la columna VALOR no est&amp;aacute;n asociados con un Id&lt;/p&gt;
&lt;p&gt;Es decir que para el Id 1, los valores deben ser B,C,D,E&lt;/p&gt;
&lt;p&gt;La primera aproximaci&amp;oacute;n para saber cual de los VALORES est&amp;aacute; aplicado a cada uno de los Id es realizar un Cross Join&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="color:#0000ff;"&gt;
&lt;p&gt;SELECT &lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;span style="color:#808080;"&gt;*&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; @t1 t1 &lt;span style="color:#808080;"&gt;cross&lt;/span&gt; &lt;span style="color:#808080;"&gt;join &lt;/span&gt;@t1 t2 &lt;/p&gt;
&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table width="50%" border="1" style="border-collapse:collapse;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td bgcolor="#c0c0c0"&gt;id&lt;/td&gt;
&lt;td bgcolor="#c0c0c0"&gt;VALOR&lt;/td&gt;
&lt;td bgcolor="#c0c0c0"&gt;id&lt;/td&gt;
&lt;td bgcolor="#c0c0c0"&gt;VALOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td bgcolor="#9bb4e6"&gt;1&lt;/td&gt;
&lt;td bgcolor="#9bb4e6"&gt;A&lt;/td&gt;
&lt;td bgcolor="#9bb4e6"&gt;1&lt;/td&gt;
&lt;td bgcolor="#9bb4e6"&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td bgcolor="#d7e0f4"&gt;1&lt;/td&gt;
&lt;td bgcolor="#d7e0f4"&gt;A&lt;/td&gt;
&lt;td bgcolor="#d7e0f4"&gt;2&lt;/td&gt;
&lt;td bgcolor="#d7e0f4"&gt;B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td bgcolor="#d7e0f4"&gt;1&lt;/td&gt;
&lt;td bgcolor="#d7e0f4"&gt;A&lt;/td&gt;
&lt;td bgcolor="#d7e0f4"&gt;3&lt;/td&gt;
&lt;td bgcolor="#d7e0f4"&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td bgcolor="#d7e0f4"&gt;1&lt;/td&gt;
&lt;td bgcolor="#d7e0f4"&gt;A&lt;/td&gt;
&lt;td bgcolor="#d7e0f4"&gt;4&lt;/td&gt;
&lt;td bgcolor="#d7e0f4"&gt;D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td bgcolor="#d7e0f4"&gt;1&lt;/td&gt;
&lt;td bgcolor="#d7e0f4"&gt;A&lt;/td&gt;
&lt;td bgcolor="#d7e0f4"&gt;5&lt;/td&gt;
&lt;td bgcolor="#d7e0f4"&gt;E&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;Se nota en &amp;eacute;sta combinaci&amp;oacute;n que 1 ya est&amp;aacute; asociado con A en la fila &lt;span style="background-color:#9bb4e6;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;nbsp;y notamos que en las columnas &lt;span style="background-color:#d7e0f4;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;nbsp;vemos que los valos con 1 no est&amp;aacute;n asociados&lt;/p&gt;
&lt;p&gt;Por lo que si creamos un condici&amp;oacute;n podemos eliminar los que ya est&amp;aacute;n asociados dejando solo los que NO est&amp;aacute;n asociados&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;SELECT &lt;/span&gt;t2&lt;span style="color:#808080;"&gt;.&lt;/span&gt;id&lt;span style="color:#808080;"&gt;,&lt;/span&gt; t1&lt;span style="color:#808080;"&gt;.&lt;/span&gt;VALOR &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; @t1 t1 &lt;span style="color:#808080;"&gt;cross join &lt;/span&gt;@t1 t2 &lt;span style="color:#0000ff;"&gt;where &lt;/span&gt;&lt;span style="color:#808080;"&gt;not&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;t1&lt;span style="color:#808080;"&gt;.&lt;/span&gt;id &lt;span style="color:#808080;"&gt;=&lt;/span&gt; t2&lt;span style="color:#808080;"&gt;.&lt;/span&gt;id &lt;span style="color:#808080;"&gt;and&lt;/span&gt; t2&lt;span style="color:#808080;"&gt;.&lt;/span&gt;VALOR &lt;span style="color:#808080;"&gt;=&lt;/span&gt; t2&lt;span style="color:#808080;"&gt;.&lt;/span&gt;VALOR &lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;table width="50%" border="1" style="border-collapse:collapse;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td bgcolor="#c0c0c0"&gt;id&lt;/td&gt;
&lt;td bgcolor="#c0c0c0"&gt;VALOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Espero sea de ayuda&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;FREDY LEANDRO ANGARITA CASTELLANOS&lt;br /&gt;Sql Server MVP&lt;br /&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/fangarita/MVPLogo.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=200379" width="1" height="1"&gt;</description></item></channel></rss>