Where In usando Variables varchar.


Esta es una cuestión que muchas veces queremos resolver, como hacer un where in contra una variable de tipo varchar.
Obviamente que en reporting services está cuestión se resuelve por si misma, pero el punto es cuando queremos ejecutar sentencias con where in dados por una variable.
Está claro que se puede ejecutar por medio de xml o sql dinámico, pero estas soluciones no están exentas de su complejidad.

La solución propuesta en este caso es la creación de una función que transforma el contenido de una variable de tipo varchar en un resultset de integers.

La función

Create function dbo.SplitToInt(@values varchar(8000), @delimiter varchar(10))
returns @result table (value int)
as
begin
declare @v as varchar(8000);
while charindex(@delimiter,@values) <> 0
begin
set @v = substring(@values,1,charindex(@delimiter,@values)-1);
if isnumeric(@v)=1
insert into @result
values(@v);
set @values = substring(@values,charindex(@delimiter,@values)+1,len(@values))
end
if isnumeric(@values)=1
insert into @result
values(@values);
return;
end

Un ejemplo:

declare @sIds varchar(10)
set @sIds = '1,3,4'
select * from tabla where id in (select * from SplitToInt(@sIds, ','))

Hugo Román Bernachea
Mail de contacto: SQLServer777@gmail.com

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea

Read More...

Consejo de Experto, Qing Song Yao recomienda NO usar char o varchar !

Qing Song Yao: Hoy quisiera recomendarles que NO usen los tipos de datos char o varchar para representar strings en su base de datos. Nunca se arrepentirán de haber usado nchar o nvarchar en cualquier implementación.
Por ejemplo, nuestra implementación de Sharepoint usa exclusivamente el tipo de datos nvarchar y nunca hemos tenido problemas relacionados con almacenar caracteres en diferentes lenguajes. Y adicionalmente los tipos unicode (nvarchar y nchar) tienen mejor soporte en .NET, ODBC, JDBC y Windows.

En cambio Varchar y Char solo admiten un rango mas limitado de caracteres y el soporte de herramientas no es tan amplio comparado con los tipos unicode (nvarchar o nchar).

Ah, me dirán que nvarchar ocupa el doble de espacio de almacenamiento si la mayor parte de los datos está dada en alfabetos latinos. Pero en SQL Server 2008 R2 existen la opción de Compresión de Datos a nivel de página, que les permite obtener una compresión a hasta la mitad del tamaño sin por eso tener un impacto significativo a nivel de performance.
De modo que recomiendo usar nvarchar junto a la compresión a nivel de página para lograr ambas cosas: menor espacio en disco y mejor soporte a nivel plataforma.
artículo original: Qing Song Yao
traducido por : Hugo Bernachea

Hugo Román Bernachea
Mail de contacto: SQLServer777@gmail.com

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea

Read More...

Como hacer una migración de SQL Server

Esta nota es un resumen de los puntos principales de la Charla de Maxi Accotto en el Edificio de Microsoft Argentina el pasado martes 19 de Abril de 2011. Esta charla trató sobre las estrategias correctas para implementar un plan de migración exitoso de una versión a otra de SQL Server.

1. Razones para migrar:
1.a) Por los nuevos features.
1.b) Por las mejoras a nivel rendimiento.
1.c) Las viejas versiones pierden soporte (sql server 7 y 2000 perdieron soporte oficial)

2. Armar un plan de Migración
2.1) El plan de migración contiene los pasos reproducibles para una migración exitosa.
2.2) Relevar todas las bases de datos a ser migradas/actualizada para detectar bases que tienen versiones no migrables (por ejemplo SQL Server 7 no puede ser migrado directamente a SQL Server 2008)
2.3) El Upgrade Advisor se ejecuta sobre el servidor a ser migrado para indicar problemas e issues: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=f5a6c5e9-4cd9-4e42-a21c-7291e7f0f852&displaylang=en
2.4) El upgrade advisor puede tomar trazas del profiler previamente guardadas para dar un análisis mas certero de cambios y eventuales problemas e incompatibilidades.
2.5) Nunca está de mas leer la documentación oficial de Microsoft acerca de las buenas prácticas (best practices) para migrar servidores SQL : http://www.microsoft.com/downloads/en/details.aspx?FamilyID=66d3e6f5-6902-4fdd-af75-9975aea5bea7&displaylang=en

3. Como realizar la migración:
3.1) In place Upgrade (no recomendada por limitar la posibilidad de rollback).
3.2) Punto a punto.

4. Puntos a garantizar en la migración.
4.1) Parte funcional de la base.
4.2) Performance.

5. Analisis de performance previo.
5.1.) RML Tools. Se toman las trazas de profiler de Replay y se aplican en el destino utilizando las herramientas RML. Las rml tools se descargan desde aquí: para X86 y para 64bits
Estas herramientas tienen además otras utilidades para medir performance.

6. Tareas post migración
6.1) Update statistics
6.2) Eventualmente recrear via script todos los índices clustered.
6.3) Transferir los logins por el famoso problema del sid que dejaría huérfanos los users de base de datos en el destino. Existen dos proc que generan el script de migración: Aquí el mismo Microsoft lo explica y dá el código fuente: http://support.microsoft.com/kb/246133. Maxi Accotto modificó este script para que además transfiera los roles y pueden encontrar ese script en el blog de Maxi Accotto aquí: http://blog.maxiaccotto.com/post/2009/10/04/Pasando-Logins-entre-servidores-SQL.aspx
7. Objetos a Migrar y orden de migración
7.1. operadores
7.2. Restauran bases
7.3. Logins.
7.4. Jobs

8. Plan de Rollback por si las cosas no salen bien.

9. Estabilizar la plataforma.
9.1. Darle un tiempo a la plataforma antes de empezar a aplicar los new features de la versión

Esto es solo un resumén de puntos sobre los que pueden trabajar para armar un plan de migración para servidores SQL Server.

Hugo Bernachea (oido en la charla de Max Accotto)
http://www.linkedin.com/in/bernachea


Otras fuentes de referencia:
http://blog.maxiaccotto.com/
http://www.microsoft.com/sql
http://www.sqlservercentral.com/articles/Upgrade/65872/

Hugo Román Bernachea
Mail de contacto: SQLServer777@gmail.com

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea

Read More...

Consideraciones imprescindibles para instalar SQL Server 2008 R2 en clúster

Un "must read" sobre todas las consideraciones a tener en cuenta, tanto a nivel de hardware, desde como formatear el disco de la forma mas conveniente, así como consideraciones a nivel permisos, software y distintos pre-requisitos para lograr conseguir una instalación exitosa de SQL Server 2008 R2 en cluster:
http://msdn.microsoft.com/es-es/sqlserver/gg601099#01

Muy pero muy buena nota, que hay que leer si o si.

Hugo Román Bernachea
Mail de contacto: SQLServer777@gmail.com

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea

Read More...

Falló el DBCC CHECKDB, y ahora que hacemos?


Que pasaría si encontraras un error en los logs indicando que tenés un error de los siguientes: torn page o checksum error. Que hacemos??
Que hacemos?

La mayoría en realidad no tiene ni idea de que es lo que hay que hacer. Que harías en esa situación en que un error de consistencia se ha detectado en una de las bases que tu (tu) administras?

La respuesta pasa por usar DBCC CHECKDB diariamente para detectar errores de consistencia.

La sintaxis básica es:

DBCC CHECKDB ('Nombre de SU base') WITH NO_INFOMSGS

NO_INFOMSGS previene que se disparen un número excesivo de mensajes, de todas maneras hay muchas opciones, pero esta realiza los chequeos mínimos necesarios.

Esta sentencia puede tomar un tiempo importante en ejecutarse si las bases de datos son grandes y en ese caso quizás pudiera querer especificar la opción PHYSICAL_ONLY, ya que esta opción chequea fisicamente en las estructuras en disco, pero omite los chequeos lógicos:

La sintaxis es:

DBCC CHECKDB ('Nombre de SU base') WITH PHYSICAL_ONLY

Ok, hay un problema y... ahora?

Siempre asumimos la existencia de los backups, no?. Todos sabemos que un indice non-clustered puede ser reconstruido sin mayores problemas, pero un indice clustered no.

La mejor opción es siempre recuperar desde un backup (en realidad siempre lo mejor es tener implementada una opción de alta disponibilidad tipo cluster o mirroring y el backup mantenerlo solamente como opción B, pero bueno, supongamos que tenemos que ir a los backups).

Primero vamos a ver que páginas están dañadas y que tipo de datos son los que están dañados (recuerdan clustered y non-clustered?)

Para empezar veamos que nos dice DBCC CHECKDB, por ejemplo una salida típica puede ser la siguiente:

Object ID 2088535921, index ID 0, partition ID 72345201021503994, alloc unit ID 72345201051571606 (type In-row data): Page (1:95555) could not be processed. See other errors for details.
Msg 8939, Level 16, State 98, Line 1
Table error: Object ID 2088535921, index ID 0, partition ID 72345201021503994, alloc unit ID 72345201051571606 (type In-row data), page (1:95555). Test (IS_OFF (BUF_IOERR, pBUF->bstat)) failed.
CHECKDB found 0 allocation errors and 2 consistency errors in table 'SU_tabla' (object ID 2088535921).
CHECKDB found 0 allocation errors and 2 consistency errors in database 'SU_base_de_datos'.
repair_allow_data_loss is the minimum repair level for the errors found by DBCC CHECKDB (SU_base_de_datos).

Acá ya sabemos cual es la página corrupta: (1:95555)

Ahora necesitamos saber si los datos están en un montón (heap), en un indice cluster o en un índice non-clustered.

Entre los datos podemos ver que es index ID 0. Podemos examinar especificamente la página (1:95555 en 'SU_base_de_datos') como vemos a continuación:

DBCC TRACEON (3604, -1)
GO
DBCC PAGE('SU_base_de_datos', 1, 95555, 3)
GO

En la salida vamos a ver algo como:

Metadata: IndexId = n

Si n es mayor a 1 entonces puede festejar ya que se trata de un índice non-clustered que puede ser borrado y recreado.
Ahora bien, si es 0 o 1 entonces ya se trata de corrupción de datos directamente y vamos a tener que hacer de lo que describiremos mas abajo.

RECUPERAR DESDE UN BACKUP

Si el "recovery model" es FULL entonces usted hará un backup de tail log (si no sabe que es un tail log backup recuerde google es nuestro amigo).
Entonces, tail log backup, restore full backup, differential backups, logs backups, etc, etc todos con la opción WITH NORECOVERY y finalmente recupere el backup de tail log pero esta vez con la opción WITH RECOVERY.
Asumo que usted tiene bien en claro los procesos de backup/restore, si así no fuera entonces llamen a un administrador experimentado antes de perder datos y eventualmente su trabajo.

Si solo fueron afectadas unas pocas páginas entonces tenemos la opción de recuperar solamente las páginas dañadas, como vemos a continuación:

RESTORE DATABASE SU_base_de_datos PAGE = '1:95555'
FROM DISK = 'C:\SU_backup.bak'
WITH NORECOVERY

Si el "recovery model" está en modo simple, entonces no tiene absolutamente ninguna opción y va a tener que aplicar un procedimiento de restore completo.

Ahora si usted no tiene absolutamente ningún backup, entonces podría llegar a aplicar la opción de automatic repair. (haga backup de todo por favor)

OPCIONES AUTOMATICAS DE REPARACION

Primero: backup, backup, backup. Queda avisado: BACKUP antes de hacer cualquier cosa que se le ocurra hacer.

Ok, miremos nuevamente la salida de CHECKDB. Ahí se especifica el mínimo nivel de reparación.

REPAIR_REBUILD
Si el nivel mínimo de reparación es REPAIR_REBUILD usted debería estar mas o menos feliz.
La sintaxis es:

DBCC CHECKDB('SU_base_de_datos', REPAIR_REBUILD)

REPAIR_ALLOW_DATA_LOSS
Con esta opción ya no debería estar tan contento.
Esta opción intentará reparar todos los errores encontrados pero retirará eventualmente la página afectada y modificará los links entre páginas,
de modo que todo quedará como si esa página nunca hubiera existido. Algo se habrá borrado y habrá que ver que consecuencias a nivel de integridad referencial y perdida de datos esto pueda haber generado.

La sintaxis es:

DBCC CHECKDB('SU_base_de_datos', REPAIR_ALLOW_DATA_LOSS)

Despues asegúrese de ejecutar DBCC CHECKCONSTRAINTS una vez finalizado el checkdb para verificar problemas de integridad referencial que puedan ocurrir y tomar las medidas apropiadas.

FINALMENTE

La opción correcta es (en el 99% de los casos) recuperar un backup. Solo usamos las opciones automáticas de recuperación cuando no nos queda absolutamente otra opción.

DBCC CHECKDB es una herramienta poderosa, pero muy peligrosa en las manos equivocadas, es como un bisturí, que tiene una utilidad en las manos de un cirujano y otra muy distinta en las manos de un chipancé.


Hugo Román Bernachea
Mail de contacto: SQLServer777@gmail.com

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea

Read More...

Libro Gratuito de Microsoft sobre PowerShell














La gente de Microsoft publicó hace algún tiempo un libro electrónico en inglés sobre Windows PowerShell.
El libro ha resultado ser un éxito. Sus casi 50 páginas ayudan a aquellos que quieren conocer Windows PowerShell.
A continuación ustedes tienen los enlaces correspondientes:

Alguna documentación interesante mas ejemplos, scripts y artículos en los siguientes links:
http://technet.microsoft.com/es-ar/library/ee221100%28en-us%29.aspx
http://technet.microsoft.com/es-es/scriptcenter/dd742419

Hugo Román Bernachea
Mail de contacto: SQLServer777@gmail.com

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea

Read More...