[Code] Cómo crear una tabla que presente repeticiones de rangos de números

 El Problema

Se quiere tener una tabla que presente los siguientes datos (por ejemplo)

 

Dato
4
5
6
7
1
2
3
4
5
6
7
1
.
.

Anteriormente en el artículo [Code] Cómo generar N Filas Rápido Sql Server , se presentan técnicas para generar una tabla de N filas rápidamente la cual usaremos para desarrollar el algoritmo, en la primera parte se tiene la tabla base, generada de la siguiente manera:

declare @CantidadRegistros int, @ValorEnQueSeReInicia int, @IniciaEn int

set @CantidadRegistros = 30 --Valor Prueba
set @ValorEnQueSeReInicia = 7
set @IniciaEn = 4
--------------------

declare @IdTabla table (Id int, Periodo int default (0))

insert into @IdTabla(Id)
select i + @IniciaEn from dbo.fnGenTable(0,@CantidadRegistros,1) genTable

select * from @IdTabla

Hasta éste punto se logra tener una tabla con la cantidad de registros que se quieren generar, se agrega una columna llamada Periodo que contendrá el valor final repitiendo el intervalo, para obtener el valor por cada fila se usará una técnica consignada en el artículo [Code] Cómo calcular un total acumulado Rápido SIN Cursores

declare @CurrentId int = @IniciaEn - 1

update @IdTabla
set @CurrentId = Periodo = case when @CurrentId = @ValorEnQueSeReInicia then 1 else @CurrentId+1 end

select * from  @IdTabla

Con el bloque de código anterior se insertan actualizan los registros dependiendo del valor que tenga y si necesita reuniciarse se hace en el case del Update, el código final:

declare @CantidadRegistros int, @ValorEnQueSeReInicia int, @IniciaEn int

set @CantidadRegistros = 30 --Valor Prueba
set @ValorEnQueSeReInicia = 7
set @IniciaEn = 4
--------------------

declare @IdTabla table (Id int, Periodo int default (0))

insert into @IdTabla(Id)
select i + @IniciaEn from dbo.fnGenTable(0,@CantidadRegistros,1) genTable

declare @CurrentId int = @IniciaEn - 1

update @IdTabla
set @CurrentId = Periodo = case when @CurrentId = @ValorEnQueSeReInicia then 1 else @CurrentId+1 end

select * from  @IdTabla

Los comentarios son bienvenidos, espero sea de ayuda,

FREDY LEANDRO ANGARITA CASTELLANOS
Sql Server MVP

[How to] Restaurar (Restore) llaves de cifrado de Reporting Services

 Las instrucciones para crear un backup de las llaves se pueden encontrar en: [How to] Respaldar (BackUp) Llaves de cifrado de Reporting Services

Restauración de la Base de Datos ReportServer

Para restaurar la base de datos es muy importante el orden, primero se debe restaurar la base de datos de ReportServer y luego proceder a restaurar las llaves de cifrado
1. Dentro de SqlServer Management Studio, Seleccionar la base de datos (Si ya existe) y hacer click derecho, seleccionar tareas (Task), Restaurar (Restore), Database (Base de datos)

2. Aparece el diálogo para restaurar bases de datos, seleccionar “From Device” y luego hacer click en las elipsis (…)

 

3. Seleccionar el archivo de backup, haciendo clic en el Botón Add

4. Seleccionar archivo a resturar

5. Una vez seleccionado el archivo el diálogo siguiente se visualizará similar al siguiente:

6. El siguiente diálogo presenta el dispositivo seleccionado (el archivo que se selecciona), debe hacerse clic sobre el check ubicado en la columna restore

7. En la siguiente imagen se presentan las opciones de restauración:

Restaurar Llaves de Cifrado

1. Un Reporting Services Configuration Manager, se hace click en Restore

2. Se selecciona el archivo SNK que contiene las llaves de cifrado

3. Una vez seleccionado, se procede a digitar la clave del archivo en el campo Password

Y se selecciona OK, lo que restaura las llaves de cifrado en el sistema

 

Los comentarios son bienvenidos, espero sea de ayuda,

FREDY LEANDRO ANGARITA CASTELLANOS
Sql Server MVP

 

[How to] Respaldar (BackUp) Llaves de cifrado de Reporting Services

Cualquiera que haya intentado hacer un respaldo y luego restaurar una base de datos de Reporting Services (sin hacer respaldo de las llaves de cifrado) se ha encontrado con que no le es posible ver la mayoría de configuraciones que requieren de una llave de cifrado para proteger la información sensible de las contraseñas, razón por la cual es necesario, para poder pasar de un servidor a otro, o restaurarlas en el mismo servidor en caso de una reinstalación; restaurar las llaves de cifrado contenidas en Reporting Services mediante los siguientes pasos:

Las instrucciones para restaurar las llaves se pueden encontrar en: [How to] Restaurar (Restore) llaves de cifrado de Reporting Services

RESPALDO DE LLAVES DE CIFRADO SQL REPORTING SERVICES

Backup de Base de Datos ReportServer

El backup de la base de datos y de las llaves de cifrado se puede hacer en cualquier orden

Se debe tener un backup de la base de datos ReportServer, para lo cual se deben seguir lo siguientes pasos:

1. Seleccionar la base de datos ReportServer, hacer click derecho sobre la misma y seleccionar Back up…

2. Posteriormente seleccionar la ubicación del backup (para este ejemplo se selección c:Bak, pero se recomienda que se ubique en una carpeta o unidad especializada para el backup)

3. Una vez seleccionado el destino del BackUp el diálogo debe aparecer similar a:

4. La pantalla para finalizar la configuración el backup de ReportServer debe observarse de la manera que se presenta a continuación (la ruta c:bakReportServer.bak puede ser cambiada para ubicar el backup en una zona de conveniencia para el usuario)

 

5. Una vez finalizado el backup exitosamente se debe observar el siguiente diálogo

 

Backup de las llaves de cifrado

1. Se debe abrir el programa Reporting Services Configuration Manager ubicado como se observa en la siguiente imagen

2. Se realiza la conexión al servidor al que se desea realizar el backup de las llaves de cifrado, una vez seleccionado se hace click en Connect

3. Se selecciona la zona Encryption Keys y se hace click en el Boton Backup

4. El Backup de las llaves de cifrado se compone de un archivo con la extensión SNK y una clave que se usa para cifrar dicho archivo (esta clave se puede generar usando www.strongpasswordgenerator.com y debe guardarse en un archivo de texto junto con el archivo SNK), estos archivos deben almacenarse en un lugar seguro, si no se recuerda la clave o si el archivo sufre algún daño debe realizarse de nuevo todo el proceso de Backup. Si no se cuenta con un backup de las llaves de cifrado, o si no se puede usar, se tendrá que realizar toda la configuración de Reporting Services de nuevo (subir reportes, Suscripciones, Origenes de Datos, etc.)
Al hacer click en las elipsis (…) se presenta un diálogo para seleccionar la ubicación del archivo SNK

 5. Para este ejemplo se ubica el archivo en el escritorio, este archivo debe ubicarse en una zona segura

 

6. Una vez seleccionada la ubicación del archivo se procede a introducir la clave generada para este Backup en los campos Password y Confirm Password (las textos en los dos campos deben ser idénticos)

 

7. Una vez generado el archivo se verá la notificación en la parte inferior en la zona Results, como aparece en la siguiente imagen:

 

Las instrucciones para restaurar las llaves se pueden encontrar en: [How to] Restaurar (Restore) llaves de cifrado de Reporting Services

Los comentarios son bienvenidos, espero sea de ayuda,

FREDY LEANDRO ANGARITA CASTELLANOS
Sql Server MVP

[Code] Archivo de configuración de Ejemplo para Instalaciones Desatendidas de SqlServer en Windows Server 2012 Core

En Sql Server es permitido realizar instalaciones desatendidas, esto se puede realizar de dos maneras, la primera es usando la linea de comando, en donde se pueden enviar parámetros al ejecutable Setup.exe ubicado en los discos de instalación de SqlServer

Como Archivo adjunto, se encuentra un archivo de configuración de ejemplo para ser usado para realizar una instalación con todas las características (Qué se permiten para WindowsServer Core)

Este Artículo es complementario de [How to] Cómo realizar una instalación de SqlServer 2012 en Windows 2012 Core

 

Los comentarios son bienvenidos, espero sea de ayuda,

FREDY LEANDRO ANGARITA CASTELLANOS
Sql Server MVP

[How to] Cómo realizar una instalación de SqlServer 2012 en Windows 2012 Core

Para realizar la prueba se requiere una máquina (física o virtual) para realizar la prueba, si no se cuenta con una licencia se puede descargar una versión de prueba en la página de Microsoft

Para el ejemplo usaré Hyper-V en una máquina con Windows 8 y SqlServer 2012 Developer Edition (descargar versión de prueba), aunque funciona para todas las versiones

Pero antes de empezar qué es Windows Server Core, para ponerlo en términos simples, es una versión que no tiene GUI, es decir, interfase gráfica con el usuario (Algunos Programas como el bloc de notas sí están disponibles) reduciendo así la cantidad de recursos requeridos por el sistema operativo para funcionar , lo que implica que la administración del sistema operativo debe realizarse enteramente mediante consola, claro, para SqlServer, existe la posiblidad de conectar remotamente un Management Studio lo que permitirá su administración gráfica

Una vez instalada o conectada la máquina virtual Windows Server 2012 Code Edition presenta una consola como la que se presenta en la siguiente imagen:

En el Menú de Hyper-V, Seleccionar Media => DVD Drive => Insert Disk… y seleccionar el Archivo .ISO del instalador de SqlServer, para este ejemplo usaré Developer Edition, pero para un servidor se debe usar Standar o Enterprise dependiendo del esquema de licencimiento con el que se cuente

Una vez se conecte el Disco, el mismo aparecerá como un DVD en la máquina virtual

Una vez preparado el archivo de configuración, se procede a la ejecución de la instrucción que inicia la instalación usando el archivo de configuración de ejemplo ubicado en [Code] Archivo de configuración de Ejemplo para Instalaciones Desatendidas de SqlServer en Windows Server 2012 Core, el cual contiene comentarios que explican las diferentes configuraciones realizadas en el archivo

 Una vez se inicia la instalación correctamente se visualiza en pantalla el diálogo presentado en la siguiente gráfica:

Dado que las opciones de configuración ya fueron dadas en el archivo de configuración el instalador no realiza ninguna pregunta al usuario, y los valores no provistos serán tomados por defecto por instalador, para realizar una instalación completa se recomienda revisar todas las opciones de instalación; en la siguiente gráfica se observa el avance de la instalación:

Una vez Finalizada la instalación:

 

 

Para habilitar las conexiones remotas se debe ejecutar

EXEC sys.sp_configure N'remote access', N'1' 

GO 

RECONFIGURE WITH OVERRIDE 

GO 

 

Los comentarios son bienvenidos, espero sea de ayuda,

FREDY LEANDRO ANGARITA CASTELLANOS
Sql Server MVP

[Code] Detección de Cambios – Parte1

 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ácil de mantener es de vital importancia para permitir un desarrollo y sostenibilidad del proyecto en el tiempo

En este especial de detección de cambios se presentarán tres diferentes técnicas usables en diferentes escenarios:

  • Dimensión de cambio lento en SSIS
  • Merge Join
  • Técnica especial de detección de cambios SSIS

En este primer artículo discutiremos el uso de la transformación de cambio lento de SSIS, esta transformación

Para este artículo se usará lla base de datos  AdventureWorksDW2012

1El primer paso, será crear una tabla de prueba en donde realizaremos la detección del cambio:

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

Luego se crea (o sea agrega un paquete para realizar la detección de cambios)

Luego se agrega un DataFlowTask

Dentro del DataFlowTask

 Se agrega un origen de datos Ole DB con la siguiente consulta:

SELECT [ProductKey]
      ,[ProductAlternateKey]
      ,[ProductSubcategoryKey]
      ,[WeightUnitMeasureCode]
      ,[SizeUnitMeasureCode]
      ,[EnglishProductName] 
  FROM [DimProduct]

 Luego se agrega una transformación de cambio lento (Slowly Changing Dimension)

Luego de conectar el origen de datos con la transformación de cambio lento se edita la transformación

Configuración de Datos

En este punto se selecciona la conexión con la base de datos con la que se desea trabajar y la tabla en la que se desean ubicar los cambios

También, se selecciona la llave de negocio (para este caso se selecciona ProductAlternateKey) con la que se va a realizar la comparación (se puede pensar como un JOIN)

El objeto es identificar:

  • Si no existe la llave en la tabla destino (para este caso Pruebas), crear el registro
  • Si existe la llave en la tabla destino, actualizar las columnas configuradas
  • Si existe en la tabla destino y no en la tabla de origen debe ser eliminado el registro en la  tabla destino

Configucíon el tipo de atributo de cada columna

Tipo Configuración Descripción Uso
Fixed Attribute Attributo Fijo, si cambia se presenta un error Se usa para validar que valores no cambien y que se presente un error en tal caso
Changing Attribute Atributo Cambiante, si cambia se actualiza Se usa para actualizar en la tabla destino los cambios encontrados al comprarla con la tabla destino
Historical Attribute Atributo histórico, guarda los cambios en nuevas filas Permite llevar un historial de cambios realizados en la tabla origen en la tabla destino

Configuración de atributos fijos y cambiantes

  • Si se han seleccionado atributos fijos se podrá seleccionar la opción para que la transformación falle en caso que se detecten cambios
  • Si se han seleccionado atributos cambiantes se puede activar la opción para que realice cambios en todos los registros que se encuentren (eso es importante dado que Merge, el cual se estudiará en la parte 2) no permite este comportamiento

Configuración de Inferencia de Miembros de Dimensión

 En caso que se esté haciendo la actualización de un Warehouse y alguno de los campos haga referencia a una dimensión aún no cargada, el sistema infiere este elemento y lo agrega (como si existiera en la tabla relacionada); esta práctica no es recomendada ya que puede llevar a incosistencias relacionales

FInalización Asistente

Presenta un resumen con las opciones seleccionadas

Visualización paquete

 Ejecución del paquete

Luego de modificar una fila en la tabla origen

Éste método tiene varias ventajas, pero una de sus desventajas es que la actualización- inserción – borrado se realizan registro a registro lo que no ofrece alto desempeño

Para casos en donde la cantidad de registros es poca ésta tecnica puede ser favorable dada su fácil aplicación

 

 

Los comentarios son bienvenidos, espero sea de ayuda,

FREDY LEANDRO ANGARITA CASTELLANOS
Sql Server MVP

[Code] Cómo crear un reporte flexible usando Jerarquías (Recursivo)

Saludos

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ículo presento una característica muy interesante de Reporting Services

Consideremos primero la siguiente Jerarquía:

 

Basado en el esquema anterior generemos una tabla de ejemplo

select 1 as Id, null as Padre, 'Sede Central' as Nombre, 0 as Valor union all
select 2 as Id, 1 as Padre, 'Estado' as Nombre, 0 as Valor  union all
select 3 as Id, 2 as Padre, 'Ciudad1' as Nombre, 0 as Valor  union all
select 4 as Id, 2 as Padre, 'Ciudad2' as Nombre, 0 as Valor  union all
select 5 as Id, 3 as Padre, 'Sede Centro' as Nombre, 11 as Valor  union all
select 6 as Id, 3 as Padre, 'Sede Sur' as Nombre, 12 as Valor  union all
select 7 as Id, 4 as Padre, 'Sede Norte' as Nombre, 15 as Valor  union all
select 8 as Id, 4 as Padre, 'Sede Occidente' as Nombre , 10 as Valor 

 

Creando el Reporte

1) Se agrega un DataSet con los datos de ejemplo

2) En la parte de presentación, para el presente ejemplo, se selecciona siguiente

3) Para el presente ejemplo seleccionamos el estilo por defecto 

4) Una vez finalizado el asitente para la creación de una tabla, editamos el grupo del reporte (recordemos que tenemos un solo grupo para el reporte que se está creando), Se debe agrupar por la columna Id dado que esta presenta un valor único y es parte de la llave para poder lograr recursividad en el reporte

 5) En la misma ventana, se selecciona Avanzado (Advanced) y se estable como Padre Recursivo (Recursive Parent) al campo Padre el cual contiene la información sobre cual de los nodos es el padre en la Jerarquía

6) Si se ejecuta el reporte no se obtiene un resultado muy interesante hasta el momento

7) Pero si se usa la función Level() se podrá detectar el nivel de la jerarquía de la fila actual lo que es útil para generar una indentación que ayude a la comprensión de los datos

En la propiedad Padding=>Left del campo Nombre se agrega el siguiente código

=CStr(2 + (Level()*20)) + «pt»

Lo que crea una indentación como la presentada en la imagen

8) Si se desea agregar un esquema de colores al reporte para seguir algún tipo de convensión se puede usar una paleta de colores, como la del siguiente ejemplo

  

 
 
 
 
 
 

Para lograr aplicar la paleta seleccionada se agrega código al reporte:

 

 

El resultado Final:

 

Claro, un diseñador gráfico logrará un mejor resultado con la paleta de colores pero para este caso es netamente ilustrativo

El archivo del reporte de ejemplo se puede encontrar en: [Sample] Cómo crear un reporte flexible usando Jerarquías (Recursivo)

 

Los comentarios son bienvenidos, espero sea de ayuda,

FREDY LEANDRO ANGARITA CASTELLANOS
Sql Server MVP

[Code] Cómo obtener las columnas de una tabla identificando su llave primaria

Se presenta el script para obtener todos los campos de una tabla y saber cual(es) de ellos son llave primaria

declare @tabla sysname 
set @tabla = 'mitabla' --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'U')
)
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'U')

Obsérvese que se usa la función OBJECT_ID para obtener el Id del Objeto que se quiere evaluar, otra opción sería:

OBJECT_NAME(ic.OBJECT_ID)  = @Tabla

pero es mas eficiente como se presenta en la consulta superior dado que sólo se ejecuta una vez la función escalar OBJECT_ID en lugar de una vez por cada registro, se observa también el uso de una instrucción CTE para calcular las llaves de la tabla

 

Los comentarios son bienvenidos, espero sea de ayuda,

FREDY LEANDRO ANGARITA CASTELLANOS
Sql Server MVP

[CODE] Cómo concatenar los resultados de una consulta

Como se observa en el artículo [CODE] Cómo obtener la llave primaria de una tabla, es posible concatenar el resultado de una consulta en una variable, lo cual es especialmente útil en la generación de código dinámico:

declare @key varchar(8000)
set @key = ''
SELECT @key  = @key  + COALESCE(TABLE_NAME + ',' , '')  from INFORMATION_SCHEMA.TABLES

if len(@key) > 0 set @key = LEFT(@key,len(@key) - 1) --Eliminar la coma que sobra al final

print @key

Se debe tener en cuenta que existen algunas limintantes, por ejemplo se debe considerar el tamaño máximo de la variable, que dependiendo de la versión de SqlServer puede ser 8000 y usando varchar(max) puede ser máximo de 2,147,483,647 caracteres

Es de notar que usar funciones CLR o funciones de texto avanzadas de SqlServer 2012 puede mejorarse el rendimiento de esta solución

Los comentarios son bienvenidos, espero sea de ayuda,

 

FREDY LEANDRO ANGARITA CASTELLANOS
Sql Server MVP