viernes, 11 de diciembre de 2009

SQL SERVER Service Broker

El SQL Service Service Broker incluye la infraestructura necesaria para la programación asincrónica y se puede utilizar para la creación de aplicaciones distribuidas a través de múltiples bases de datos.

Ejemplo Basico de Service Broker

Crear Base de Datos y habilitar servicio

CREATE DATABASE ServiceBrokerTest
GO
USE ServiceBrokerTest
GO
-- Habilitar Service Broker
ALTER DATABASE ServiceBrokerTest SET ENABLE_BROKER
GO


Son 4 Elementos Basicos

- Mensaje
- Contrato
- Cola
-Cola de Envio
-Cola de Recepcion
- Servicio
-Servicio de Envio
-Servicio de Recepcion


-- Crear Mensaje
CREATE MESSAGE TYPE SBMessage
VALIDATION = NONE
GO
-- Crear Contrato
CREATE CONTRACT SBContract
(SBMessage SENT BY INITIATOR)
GO
-- Crear Cola de Envio
CREATE QUEUE SBSendQueue
GO
-- Crear Cola de Recepcion
CREATE QUEUE SBReceiveQueue
GO

-- Crear Servicio de Envio para Cola de Envio
CREATE SERVICE SBSendService
ON QUEUE SBSendQueue (SBContract)
GO
-- Creando Servicio de Recepcion para Cola de Recepcion
CREATE SERVICE SBReceiveService
ON QUEUE SBReceiveQueue (SBContract)
GO

-- Iniciar Dialogo usando el servicio en el contrato
DECLARE @SBDialog uniqueidentifier
DECLARE @Message nvarchar(128)
BEGIN DIALOG CONVERSATION @SBDialog
FROM SERVICE SBSendService
TO SERVICE 'SBReceiveService'
ON CONTRACT SBContract
WITH ENCRYPTION = OFF
-- Enviando Mensajes al Dialogo
SET @Message = N'Primer Mensaje';
SEND ON CONVERSATION @SBDialog
MESSAGE TYPE SBMessage (@Message)
SET @Message = N'Segundo Mensaje';
SEND ON CONVERSATION @SBDialog
MESSAGE TYPE SBMessage (@Message)
SET @Message = N'Tercer Mensaje';
SEND ON CONVERSATION @SBDialog
MESSAGE TYPE SBMessage (@Message)
GO

-- Viendo Mensajes de la cola de Recepcion
SELECT CONVERT(NVARCHAR(max), message_body) AS Message
FROM SBReceiveQueue
GO

-- Recibiendo Mensajes de la Cola de Recepcion
RECEIVE TOP(1) CONVERT(NVARCHAR(max), message_body) AS Message
FROM SBReceiveQueue
GO

-- Recibiendo Mensajes de la Cola de Recepcion
RECEIVE CONVERT(NVARCHAR(max), message_body) AS Message
FROM SBReceiveQueue
GO

SQL Server Service Broker (SSSB)

El SQL Service Service Broker incluye la infraestructura necesaria para la programación asincrónica y se puede utilizar para la creación de aplicaciones distribuidas a través de múltiples bases de datos.

A continuacion se detalla la sintaxis basica para utilizar el SQL Server Service Broker.

1. Habilitar la base de datos
ALTER DATABASE Demo SET ENABLE_BROKER

2. Message Type
Define el nombre del mensaje y el tipo de informacion que el mensaje contiene. Estos mensajes deben ser creados en ambas partes de la conversacion

CREATE MESSAGE TYPE message_type_name
[AUTHORIZATION owner_name]
[VALIDATION =
{NONE EMPTY WELL_FORMED_XML
VALID_XML WITH SCHEMA COLLECTION schema_collection_name}]

Los posibles valores para VALIDATION son:
NONE: no se realiza ninguna validación
EMPTY: El cuerpo del mensaje debe tener valor NULO
WELL_FORMED_XML: Debe contener un XML bien formado
VALID_XML WITH SCHEMA COLLECTION: El contenido del XML debe cumplir con el XML SCHEMA señalado

Para modificarlo:
ALTER MESSAGE TYPE message_type_name
VALIDATION =
{NONE EMPTY WELL_FORMED_XML
VALID_XML WITH SCHEMA COLLECTION schema_collection_name}]

Y para eliminar:
DROP MESSAGE TYPE message_type_name

3. Contract
Define los tipos de mensajes que un servicio puede utilizar en una conversación y la dirección en que los mensajes pueden ser enviados

CREATE CONTRACT contract_name
[ AUTHORIZATION owner_name ]
( { message_type_name SENT BY { INITIATOR TARGET ANY }
[ DEFAULT ] } [ ,...n] )

Los posibles valores para SENT BY son:
INITIATOR: indica que solo el iniciador puede enviar dicho tipo de mensaje
TARGET: Indica que solo el destino puede enviar dicho tipo de mensaje
ANY: Indica que tanto el iniciador y el destino pueden enviar dicho tipo de mensaje

Para eliminar un contrato la sintaxis es la siguiente:

DROP CONTRACT contract_name

4. Queue
Define la ubicación donde se almacenaran los mensajes hasta que un servicio este disponible para atender los mensajes

CREATE QUEUE [database_name.[schema_name].schema_name.] queue_name
[ WITH
[ STATUS = { ON OFF } [ , ] ]
[ RETENTION = { ON OFF } [ , ] ]
[ ACTIVATION (
[ STATUS = { ON OFF } , ]
PROCEDURE_NAME = stored_procedure_name,
MAX_QUEUE_READERS = max_readers ,
EXECUTE AS { SELF 'user_name' OWNER }
) ]
]
[ ON { filegroup [ DEFAULT ] } ]

STATUS: Especifica si la cola esta habilitada. Cuando esta en OFF ningún servicio podría retirar mensajes de la cola.

RETENTION:Indica si la cola debe mantener todos los mensajes hasta que la conversación finalice

ACTIVATION STATUS: Indica si se debe activar el procedimiento almacenado cuando llegue un mensaje a la cola

MAX_QUEUE_READERS: Indica la cantidad máxima de servicio que correrán simultáneamente

EXECUTE AS: especifica la cuenta de usuario con que correrá el servicio

Para modificar esta es la sintaxis

ALTER QUEUE [database_name.[schema_name].schema_name.] queue_name
[ WITH
[ STATUS = { ON OFF } [ , ] ]
[ RETENTION = { ON OFF } [ , ] ]
[ ACTIVATION (
[ STATUS = { ON OFF } , ]
PROCEDURE_NAME = stored_procedure_name,
MAX_QUEUE_READERS = max_readers ,
EXECUTE AS { SELF 'user_name' OWNER }
] DROP })
]

Para eliminar una cola la sintaxis es:

DROP QUEUE [database_name.[schema_name].schema_name.] queue_name

5. SERVICE
Relaciona las colas con los contractos

CREATE SERVICE service_name
[ AUTHORIZATION owner_name ]
ON QUEUE [ schema_name. ]queue_name
[ ( contract_name [DEFAULT] [ ,...n ] ) ]

Para modificar el servicio utilice la siguiente sintaxis:

ALTER SERVICE service_name
[ON QUEUE [schema_name].queue_name]
[(ADD CONTRACT contract_nameDROP CONTRACT contract_name)]


ON QUEUE: Especifica la nueva cola para el servicio y mueve todos los mensajes de la cola vieja a la nueva

ADD CONTRACT: Añade un contrato a la colección de contratos asociados a este servicio

DROP CONTRACT: Especifica los contratos que se eliminaran del servicio. En caso de que alguno se este ejecutando mostrara un mensaje de error.

Para comenzar a usar los servicios se deben establecer una conversación. Estos son los pasos para establecer una conversación.

Crear la variable que identificara de manera única la conversación.

DECLARE @dialog_handle uniqueidentifier

Iniciar la conversación

BEGIN DIALOG [ CONVERSATION ] @dialog_handle
FROM SERVICE initiator_service_name
TO SERVICE 'target_service_name'
[ , { 'service_broker_guid' 'CURRENT DATABASE' } ]
[ ON CONTRACT contract_name ]
[ WITH
[ { RELATED_CONVERSATION = related_conversation_handle
RELATED_CONVERSATION_GROUP = related_conversation_group_id } ]
[ [ , ] LIFETIME = dialog_lifetime ]
[ [ , ] ENCRYPTION = { ON OFF } ] ]

RELATED_CONVERSATION o RELATED_CONVERSATION_GROUP relaciona un nuevo dialogo con una conversacion existente

LIFETIME= tiempo en segundo en la que será valido el dialogo

Enviar mensaje

SEND
ON CONVERSATION conversation_handle
[ MESSAGE TYPE message_type_name ]
[ ( message_body_expression ) ]

El destino recibe el mensaje

[ WAITFOR ( ]
RECEIVE [ TOP ( n ) ]
[ ,...n ]
FROM
[ INTO table_variable ]
[ WHERE { conversation_handle = conversation_handle
conversation_group_id = conversation_group_id } ]
[ ) ] [ , TIMEOUT timeout ]

WAITFOR: especifica que la clausula RECEIVE espera un mensaje

RECEIVE: lee los mensajes de la cola y los elimina en caso de que la opción RETENTION de la cola este desactivada.

TOP: Indica cuantos mensajes se van a leer de la cola, sino se especifica se leerán todos los mensajes

INTO: Ingresa todos los mensajes en una tabla para ser tratados después

WHERE: especifica la conversación o grupo de conversaciones para los mensajes leídos

TIMEOUT: Especifica el tiempo en milisegundos en que la instrucción espera un mensaje.

Para terminar la conversación

END CONVERSATION conversation_handle
[ [ WITH ERROR = failure_code DESCRIPTION = 'failure_text' ]
[ WITH CLEANUP ]

viernes, 13 de noviembre de 2009

Trabajando con SQL CLR

La version SQL Server 2005, integro por primera vez el .NET Framework con T-SQL. Desde esta version es posible crear funciones, procedimientos, triggers y tipos de datos desde codigo VB.NET o C#. Sin embargo esto no viene a reemplazar, al lenguaje de consulta estructurado (SQL por sus siglas), sino mas bien a complementar, con la potencia de lenguajes de codigo, con los cuales podra ser mas facil realizar iteraciones, donde hay bastante programacion y donde no hay consultas directas, podremos hacer uso de esta caracteristica.

A continuacion ejemplos y pasos a seguir para el uso de CLR.

1. Habilitar SQL CLR
sp_configure 'clr_enabled', 1
RECONFIGURE
O bien de manera visual desde SQL Server Surface Area Configuration

2. Crear un proyecto en Visual Studio de tipo Class Library.

3. Definir los nombres de espacio
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server

4. Estamos listos para crear Funciones, Procedimientos o tipos de Datos.
A continuacion un ejemplo de Funciones y Procedimientos con acceso a ADO.NET

Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server


Public Class Data
_
Public Shared Function HolaSQLCLR() As Integer

Return "Informacion a Regresar. Hola Mundo"
End Function

_
Public Shared Sub GetProductos()

'Dim conn As New SqlConnection("context connection=true")
Dim conn As New SqlConnection("Data Source=.;Initial Catalog=Northwind;uid=sa;pwd=123")
conn.Open()

Dim cmd As New SqlCommand("SELECT ProductID, ProductName, QuantityPerUnit " & _
"FROM Products ORDER BY ProductName", conn)

Dim reader As SqlDataReader
reader = cmd.ExecuteReader

Dim oPipe As SqlPipe
oPipe = SqlContext.Pipe
oPipe.Send(reader)
oPipe.Send("Resultados enviados al cliente")

End Sub
End Class

5. Registrar la DLL en nuestro servidor.
CREATE ASSEMBLY MyDLL FROM 'c:\MyDll.dll'

6. Crear los procedimientos o funciones.
CREATE PROC sp_clr
AS EXTERNAL NAME MyDLL.[Clientes.Data].GetProductos


CREATE FUNCTION dbo.fxDatos()
RETURNS INT
EXTERNAL NAME MyDLL.[Clientes.Data].GetCustomers


7. Ejecutarlos tal y cual se ejecutan con T-SQL
exec sp_clr;
select dbo.fxDatos()

viernes, 6 de noviembre de 2009

Replicacion de Datos en SQL Server

La replicacion es SQL Server, es un proceso muy util para empresas que necesitan tener disponibilidad de la informacion y no cuentan con la infraestructura necesaria para tener una base de datos online, o bien para el procesamiento de datos de manera distribuida y luego centralizar la informacion.

La replicacion se asemeja a un Editorial de un Periodico, donde existe un Publicador (El Editorial), una Publicacion (Periodico), la cual contendra Articulos, todo esto sera distribuido y llegara a las manos del Suscriptor (El Lector).

En esta diapositiva se explica un poco esa metafora.

Consultas Distribuidas - Primera Parte

-- Agregar un Servidor Externo
sp_addlinkedserver
@Server = 'PORTATIL',
@srvproduct='SQL Server'

-- Ver Lista de Servidores
SELECT * FROM sys.servers s

-- Borrar un Servidor
EXEC sp_dropserver @server = 'PORTATIL'

-- Agregar Logins y Seguridad
sp_addlinkedsrvlogin
@rmtsrvname = 'PORTATIL',
@useself = 'False',
@locallogin = 'BERNARDO\Bernardo',
@rmtuser = 'sa',
@rmtpassword = '123'

-- Agregar Servidor de Excel
EXEC sp_addlinkedserver
@Server = 'Phones',
@SrvProduct = 'Excel',
@Provider='Microsoft.Jet.OleDB.4.0',
@DataSrc = 'c:\Data\Phones.xls',
@ProvStr='Excel 5.0'


EXEC sp_addlinkedsrvlogin
@rmtSrvName= 'Phones',
@UseSelf= 'False'


-- Agregar Servidor de Access
EXEC sp_addlinkedserver
'Telef',
'Access 2003',
'Microsoft.Jet.OLEDB.4.0',
'c:\Data\Phones.mdb'


sp_configure 'show advanced options', 1
RECONFIGURE
sp_configure 'Ad Hoc Distributed Queries', 1
RECONFIGURE


-- Accediendo a Datos Locales
SELECT * FROM Northwind.dbo.Customers c
SELECT * FROM Northwind..Customers c


-- Cuatro Partes de Nombre
SELECT * FROM PORTATIL.Northwind.dbo.Customers

SELECT * FROM phones...Telefonos


-- Sin linked server - SQL Server
SELECT *
FROM OPENDATASOURCE(
'SQLNCLI',
'Data Source=PORTATIL;User ID=sa;Pwd=123;'
).Northwind.dbo.Customers;

-- Sin linked server - Access
SELECT ContactFirstName, ContactLastName
FROM OPENDATASOURCE ('Microsoft.Jet.OLEDB.4.0',
'Data Source = C:\SQLData\CHA1_Customers.mdb')...Customers;


-- OpenRowSet
SELECT *
FROM OPENROWSET('SQLOLEDB','Server=PORTATIL;Uid=sa;Pwd=123;','SELECT * FROM Northwind.dbo.Customers;') AS a

SQL Server - Como se Almacenan los Datos

Informacion necesaria para el Calculo del Tamaño de las Tablas en SQL Server

martes, 4 de agosto de 2009

Base de Datos de Ejemplos

Adjunto enlace para su descarga:

http://www.4shared.com/file/122998012/e9ae93c/HospitalDB.html
http://www.4shared.com/file/123688641/8428a0a0/Cuentos.html
http://www.4shared.com/file/123873960/a51ec429/RawData.html

lunes, 27 de julio de 2009

Puntos a Recordar en SSIS

Respondiendo a algunas inquietudes sobre SSIS, aqui dejo algunos puntos importantes a tener en cuenta:

1. Recursos para SSIS, tips & tricks, componentes, articulos.
http://www.sqlis.com/

2. Por defecto, al crear un nuevo Paquete DTSX se utiliza el valor EncryptSensitiveWithUserKey, por lo cual, sólo podremos abrir o ejecutar el Paquete DTSX utilizando el mismo usuario y computadora.

3. Si alguien usa el nivel de protección del paquete predeterminado EncryptSenstiveWithUserKey entonces el mismo paquete podría no ser ejecutado como se esperaba en otros entornos porque el paquete fue cifrado con una clave personal de usuario.

4. Si deseamos abrir o ejecutar el Paquete DTSX en otra computadora o con otro usuario, podemos solucionar este problema utilizando un valor de ProtectionLevel que utilice encriptación por Password (ej: EncryptSensitiveWithPassword), facilitando la contraseña para poder abrir o ejecutar el Paquete DTSX. Como alternativa, podemos utilizar el valor DontSaveSensitive y utilizar archivo de configuración para almacenar la información sensible.

5. Para Ejecutar un Paquete DTSX desde un Job del Agente de SQL Server. Desde un JOB del Agente de SQL Server, podemos añadir un paso del tipo SQL Server Integration Services Package, y en las propiedades de dicho paso, podemos especificar todas las opciones necesarias para ejecutar el Paquete DTSX, del mismo modo que lo haríamos con dtexecui. Sin embargo, el Agente de SQL Server nos permitirá planificar la ejecución de nuestro Paquete DTSX, y disfrutar de todas las ventajas que ofrece el Agente de SQL Server (Alertas, Operadores, etc.). Permite ejecutar un paquete independiente de que esté almacenado en el File System, en SQL Server, o en el Package Store.

6. Requiere instalar SSIS en la máquina SQL Server en la que se desea ejecutar el JOB.. Se debe garantizar que el usuario utilizado en las Credenciales (Credentials) de la cuenta Proxy empleada en el paso del JOB, tiene los suficientes permisos (ej: acceso al sistema de ficheros, conexiones de base de datos, etc.) para la ejecución del Paquete DTSX

7. Recordar que al encriptar la informacion sensible, esta debe existir de lo contrario parecera que no fue encriptada, no pedira password.

8. Es posible encriptar nuestra configuracion almacenada en un archivo .dtsconfig ?
No, en esta version no es posible.
http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=126477

9. Valores Posibles de la propiedad ProtectionLevel del Paquete DTSX.
DontSaveSensitive: La Información sensible no es guardada en el paquete
EncryptAllWithPassword: Cifra el paquete entero utilizando una contraseña
EncryptAllWithUserKey: Cifra el paquete entero utilizando claves basados en el perfil del usuario. Sólo el mismo usuario utilizando el mismo perfil puede cargar el paquete.
EncryptSensitiveWithPassword: Cifra sólo la información sensible que contiene en el paquete con una contraseña.
EncryptSensitiveWithUserKey: Cifra todo el paquete con claves basados en el usuario actual. Sólo el mismo usuario utilizando el mismo perfil puede cargar el paquete. Si un usuario diferente abre el paquete, la información confidencial se sustituye por los espacios en blanco.
ServerStorage: Cifra el paquete en una base de datos de MSDB de SQL Server. Esta opción es compatible sólo cuando un paquete se guarda en SQL Server. No es compatible cuando se guarda un paquete al sistema de archivos. El control de acceso de que quien puede descifrar el paquete está controlado por los roles de base de datos SQL Server.

10. Preguntas mas usuales con sus respuestas
http://blogs.pragmaticworks.com/devin_knight/2009/06/answers-to-advanced-ssis-interview-question.html

miércoles, 22 de julio de 2009

Variables en SSIS

Que son Variables?
Propiedades de Variables
Tipos de Variables
Donde usar variables?
Expresiones

SQL Server Integration Services

Check out this SlideShare Presentation:

jueves, 9 de julio de 2009

Crear un Estilo Alternativo para Cada Fila en Reporting Services

Muy util, es crear un estilo alternativo, lo podemos hacer con la funcion RowNumber, y Mod.

Seleccionar la fila del detalle de la tabla, y en la propiedad backcolor utilizar la siguiente expresion:

=IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")

miércoles, 8 de julio de 2009

Problemas al mostrar un DataField en el Header del Reporte de SRSS

Si tienen la necesidad de mostrar un campo de la fuente de datos en el Header de un reporte de Reporting Services, sera tarea imposible (No lo puedo creer).

Para ello realizaremos el siguiente procedimiento:

1. Propiedades del Reporte
2. Ubicarse en la Pestaña Code
3. Crear la siguiente funcion generica:

Public Function GetEncabezado(Items as ReportItems, Campo as string) as String
Return Items(Campo).Value
End Function

4. Agregar un Texbox en el Header y crear la siguiente expresion:
=Code.GetEncabezado(ReportItems, "ProductName")

"ProductName" es el nombre del campo que deseamos mostrar.

Formato Condicional para Monedas Locales.

Es facil aplicar formato a los numeros y formatearlos:

c --> Nos dara el valor currency (moneda configurada en el servidor)
c0 -> Igual al anterior sin decimales
N2 --> Formateado a 2 decimales y con separador de miles

Pero si queremos tener mas control de ello tenemos que usar el clasico y un poco olvidado formato:

##,###.00

Entonces podemos anteceder cualquier caracter o colocarlo al final.

C$ ##,###.00

Moneda local Cordobas.

Saludos,

Mostrar Imagen de Base de Datos Northwind en SSRS

Mostrar una imagen almacenada en una Base de Datos en Reporting Services es sumamente facil, no obstante tenemos una dificultad cuando trabajamos con la base de datos Northwind, recordemos que es un Conversion de Access a SQL Server 2000, la imagen no es un gif standard por lo que tenemos que convertirla.

Aqui les dejo la linea de codigo:

=System.Convert.FromBase64String(Mid(System.Convert.ToBase64String(Fields!Picture.Value), 105))

Se debera colocar en la propiedad Value de la imagen.