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