Entradas

Mostrando las entradas etiquetadas como managment studio

Actualizando columnas identity en SQL Server

Imagen
Aclaremos algunos conceptos primero, la propiedad identity puede ser utilizada para generar automáticamente valores clave en una columna, con esto quiere decir que una columna identity no tiene que ser necesariamente una clave primaria, y una clave primaria no tiene que llevar necesariamente la propiedad identity. Una columna identity no puede ser modificada ( Cannot update identity column ), la opción identity_insert sólo permite insertar valores en este tipo de columnas, pero nunca actualizarlos. ¿cómo actualizarlos entonces? Pongámonos en el peor de los casos, una clave primaria de tipo identity a la que hacen referencia foreign keys de otras tablas, si necesitásemos actualizar los valores deberíamos seguir el siguiente procedimiento: identificar todas las foreign keys que apuntan a la columna identity que deseamos modificar (esto lo podemos hacer con el SSMS escribiendo el nombre de la tabla, seleccionándolo y pulsando Alt + F1, o lo que es lo mismo ejecu...

Actualizar clave primaria autoincrement en SQL Server

Imagen
Por defecto SQL Server no deja modificar los índices autoincrement, ni siquiera poniendo la sintaxis: SET IDENTITY_INSERT TuTabla ON GO Para poder actualizar los valores de estos índices hay miles de tutoriales, pero a mi modo de ver todos demasiado complejos u obsoletos, con SQL Server 2016 lo he podido hacer siguiendo los pasos que voy a describir en este post. Lo primero es actualizar todas las claves foráneas para que al actualizar el valor del índice este se actualice en cascada, esto se puede hacer desde el SSMS sin mayor problema. Luego eliminare de la clave primaria el autoincrement de la siguiente forma: Una vez realizado este cambio puedes modificar los valores de los índices en esa columna. Ojo, no es necesario eliminar la clave primaria ni crear columnas adicionales como dicen otros manuales. Tampoco es necesario que en la consulta ejecutes el comando SET IDENTITY_INSERT TuTabla ON antes. Nada de esto es necesario con este procedimiento. ...

Alta disponibilidad con un espejo en SQL Server

SQL Server tiene varias formas para que dispongamos de alta disponibilidad en nuestras bases de datos, en este post veremos una de ellas: la creación de un espejo. Para mi la creación de un espejo vs un clúster es una preferencia personal, creo que un clúster es más complejo de mantener y gestionar, es más caro porque ambas máquinas comparten el almacenamiento y por lo menos mi experiencia con SQL Server 2008 R2 no fue muy buena y sin un soporte premiun por parte de Microsoft los fallos son difícilmente corregibles. En cambio un mirror o espejo es sencillo de configurar y pueden ser dos máquinas totalmente independientes. ¿Por qué crear un espejo en SQL Server? Porque este método permite hacer una réplica exacta de una base de datos de un servidor a otro. La gran ventaja de este método es que permite el failover automático sin intervención humana (siempre que se instale un tercer servidor witness). La desventaja del mirror es que sólo podemos tener una máquina secundaria o mirro...

Instalando SSMS 2016 CTP2 en Windows 10

Al descargar el instalador web del nuevo SQL Server Managment Studio 2016 y ejecutarlo en mi máquina con Windows 10 build 10158, me daba el siguiente error: Error 0x800713ec: Process returned error: 0x13ec Error 0x800713ec: Failed to execute EXE package. Error 0x800713ec: Failed to configure per-machine EXE package. Applied execute package: VS2010SP1Update, result: 0x800713ec, restart: None Error 0x800713ec: Failed to execute EXE package. Este error se produce porque SQL Server 2016 requiere Visual Studio 2010. Al instalarlo hay un error ( 0x800713ec – Asia ) cuando intenta instalar el SP1. El error se produce tanto con el instalador web como con la ISO completa. Es cierto que con el instalador web las pistas no son tan claras pero gracias a la ISO pude descargarme el SP1 de Visual Studio 2010   he instalarlo sin problemas. Si solo tienes SSMS puedes descargar la ISO completa (previo registro) y actualizar los componentes, mucho mejor que con el instalador web que sospecho...

SSMS ya tiene su propia ruta de actualizaciones

SQL Server 2016 ya está en la fase 2 de beta técnica y ha sido lanzado al público con una licencia de prueba de 180 días y cargado de novedades. Una de las más importantes, y sobre la que hablaré en este post, es la nueva ruta de actualizaciones que recibe SQL Server Management Studio (SSMS). Era ya muy necesario el proceso de modernización de SQL Server Management Studio como la principal aplicación / herramienta de gestión para interactuar con la plataforma insignia de base de datos de Microsoft, se había quedado a la zaga del resto de avances en el producto. Desde el año 2005 cuando se libera SSMS como la evolución de SQL Server Enterprise Manager solamente parecía actualizarse con el fin de proporcionar todas las funcionalidades añadidas como características a SQL Server. Finalmente comienza a parecer que el equipo de ingeniería de SQL Server ha hecho caso y ha comenzado a aumentar, no sólo los recursos y el personal de desarrollo necesarios, sino también proporcionar una ma...

Consultas útiles SQL Server

Muchas veces necesitamos conocer las tablas, campos, claves, etc. de una base de datos en concreto, todos estos datos están disponibles en tablas de sistema de SQL Server, veamos algunos ejemplos. Devolver las tablas de la base de datos actual con sus claves primarias SELECT i1.TABLE_NAME, i2.COLUMN_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY' Devolver los campos de una tabla concreta que son claves foráneas y la tabla a la que hace referencia SELECT CU.COLUMN_NAME, PK.TABLE_NAME FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME WHERE FK.TABLE_NAME = ? Devo...

Programar un trabajo en SQL Server anualmente

El agente de SQL Server no trae por defecto (ni en la versión de 2014) la opción de crear trabajos programados que se ejecuten anualmente, para ello tenemos que recurrir a un truco que si bien es lógico no es trivial verlo. La solución para ejecutar un trabajo programado de manera anual en SQL Server es ejecutarlo un día concreto cada 12 meses. Os dejo la pantalla resaltada con las opciones que habría que señalar, en el ejemplo se ejecuta a las 00:00:01 todos los primero de enero (el primer día del año).

Trabajar con Excel en SQL Server

Muchas veces necesitamos obtener datos desde un Excel e importarlos en una tabla de nuestra base de datos o sencillamente utilizarlos con alguna consulta, si este es tu caso este tutorial te puede ayudar a trabajar con archivos Excel como si fueran una base de datos y cada una de sus hojas como una tabla. Lo primero que tienes que tener instado en el servidor donde está SQL Server (no vale en la máquina remota donde haces las consultas) es el Office o en su defecto 2007 Office System Driver Data Connectivity Components (solo 32 bits) o Microsoft Access Database Engine 2010 Redistributable (versiones de 32 y 64 bits). Es muy muy importante tener esto instalado para evitar el siguiente error The OLE DB provider "Microsoft.ACE.OLEDB.12.0" has not been registered . Más importante aún es tener la versión correcta, si tu SQL Server es de 64 bits solo puedes instalar de 64 bits, si es de 32 bits lo mismo, en caso contrario tendrías el siguiente error OLE DB provider 'Micr...

PsExec y SQL Server

Microsoft tiene un kit de recursos con varias herramientas para la línea de comandos que permiten realizar administrar sistemas remotos y locales . Este grupo de herramientas es conocido como PsTools y entre ella está Psexec , una herramienta para la línea de comandos que permite ejecutar procesos en equipos remotos. ¿Como ejecutar psexec en un trigger de SQL Server? En realidad esto es válido para cualquier aplicación local. SET @cadena='C:\ruta_completa\psexec.exe \\ip_remota\  -d "C:\ruta_archivo_bat.bat" var1±'+@var1+'~var2±'+@var2+', NO_OUTPUT' Con el comando anterior especificamos la ruta del archivo local ejecutable y la el proceso bat que queremos ejecutar en remoto, las variables 1 y 2 son opcionales en caso de que vuestro proceso bat las necesite. Con el siguiente comando ejecutamos la instrucción almacenada en la variable anterior exec master..xp_cmdshell @cadena Recordar que el usuario que ejecuta los procesos de SQL Server debe de...

Optimizando consultas en SQL Server

Imagen
SQL Server Managment Studio es, y no me cansaré de decirlo, la mejor herramienta para gestión de bases de datos que existe, si MySQL tuviese algo similar sería genial. Una de las cosas que podemos hacer con SQL Server Managment Studio es optimizar y analizar nuestros índices. Como diría el mismo Microsoft: SQL Server Management Studio es una herramienta gráfica interactiva que permite a un administrador o a un programador de bases de datos escribir consultas, ejecutar simultáneamente varias consultas, ver los resultados, analizar el plan de consultas y recibir asistencia para mejorar el rendimiento de las consultas. Optimizando consultas en SQL Server Una de las opciones en SQL Server es ejecutar una consulta y ver su plan de ejecución ¿Qué es un plan de ejecución? Las opciones del Plan de ejecución muestran gráficamente los métodos de recuperación de datos elegidos por el optimizador de consultas de SQL Server . El plan de ejecución gráfico utiliza iconos para r...

SQL Server vs MySQL

Imagen
Esto no es una comparativa a nivel profundo ni lo pretende ser, mi único objetivo es remarcar desde el punto de vista de un usuario básico las ventajas de uno u otro sistema a la hora de trabajar con ellos. No a la hora de instalarlos, configurarlos ni mantenerlos, solo a la hora de pedir datos almacenados en estos gestores de bases de datos. Por mi trabajo tengo que manejar ambos sistemas a partes iguales y muchas veces extraño cosas de uno en el otro y viceversa, aquí os dejo una pequeña comparativa desde mi punto de vista y basada en mi experiencia profesional, si alguien descubre algún error o una mejor forma de hacer las cosas estaría encantado de recibir un feedback. Cosas que agradezco de MySQL Me encantan las sintaxis ON DUPLICATE KEY e INSERT IGNORE, me parecen muy útiles a la hora de ejecutar consultas y gestionar errores. El uso de los índices de texto completo me parecen mucho más sencillo e intuitivo sobre todo con la integración de estos en tablas InnoDB desde las...

Almacenar IPs en las bases de datos

Imagen
La mayoría de los usuarios cuando tienen que almacenar IPs en sus bases de datos los hacen con tipos de campos VARCHAR cuando es mucho más óptimo almacenarlos con un entero sin signo (en caso de MySQL) o BIG INT (en caso de SQL Server). Convertir IPs en MySQL Existen 2 funciones para ello inet_aton e inet_ntoa , la primera convierte la IP en un número y la segunda es el proceso contrario. Convertir IPs en SQL Server En SQL Server no hay funciones predefinidas para ello pero las podemos crear muy fácilmente, en el siguiente enlace hay un par de ejemplos muy buenos para convertir IPs a BIG INT en SQL Server y viceversa . Esta transformación también la podemos hacer al insertar los datos en el lenguaje de programación, en el caso de PHP sería ip2long y long2ip .

SQL Server default values

Si alguna vez habéis querido insertar en una tabla solo los valores por defecto , en SQL es muy fácil hacerlo con el siguiente comando: INSERT INTO tabla DEFAULT VALUES Para ver las opciones del comando insert en la web de Microsoft hay una información muy bien detallada.

SQL Server OUTPUT

Imagen
El comando OUTPUT es uno de los más interesantes y útiles en SQL Server, se utiliza para devolver los datos de las filas insertadas, actualizadas o eliminadas. Por ejemplo, para obtener el id de una nueva fila insertada: INSERT INTO tabla (campos) OUTPUT inserted.tabla_id VALUES (valores) La tabla inserted es una tabla temporal que almacena los datos de la fila insertada incluyendo en nuevo ID. Al actualizar debemos utilizar esta misma palabra clave y lo que devuelve son los datos de la fila al modificarse. O sea al insertar u actualizar obtenemos los datos nuevos y al eliminar obtendremos los antiguos usando el comando deleted. Sin dudas el uso más frecuente es obtener la clave única al insertar datos en una tabla sin necesidad de ejecutar una consulta adicional .

SQL Server tipos de datos

Imagen
Más que escribir y describir sobre los tipos de datos en SQL Server , en este post pretendo aclarar o definir algunas curiosidades y/o novedades de los tipos de datos en las nuevas versiones de SQL Server , como por ejemplo la 2008 R2 y la recién estrenada 2012. Tipos de datos deprecados (obsoletos) Desde SQL Server 2008 R2 los tipos de datos timestamp (hablaré más adelante sobre él) y text (ntext también) se encuentran obsoletos y en futuras versiones dejaran de existir (en la 2012 aún existen pero solo por mera compatibilidad). Timestamp Los tipos de datos timestamp para los que estamos acostumbrados a MySQL pensamos que va a hacer lo mismo que en este tipo de servidores, actualizar la fecha cada vez que se inserta o actualiza una fila. La primera diferencia es que timestamp en SQL Server nunca ha almacenado una fecha, es un valor entero único pero no corresponde con una fecha, en las nuevas versiones el tipo de campo que lo viene a sustituir es el uniqueid. Text y Ntext Los ...

Tips para campos datetime en SQL Server

Imagen
Para mi es mucho más sencillo e intuitivo trabajar con campos datetime en MySQL pero SQL Server ofrece las mismas (sino alguna más) posibilidades de convertir estos campos en formatos concretos de hora y fecha. Para ello tenemos las funciones CONVERT y DATEPART . Aquí os dejo algunos ejemplos de su uso. Convertir un campo datetime a fecha en castellano (el año con 4 dígitos) SELECT CONVERT(VARCHAR(10), CURRENT_TIMESTAMP, 103); Convertir un campo datetime a fecha en castellano (el año con 2 dígitos) SELECT CONVERT(VARCHAR(8), CURRENT_TIMESTAMP, 3); Extraer la fecha de un campo datetime SELECT CONVERT(DATE, CURRENT_TIMESTAMP); Extraer el tiempo de un campo datetime con milisegundos SELECT CONVERT(TIME, CURRENT_TIMESTAMP); Extraer el tiempo de un campo datetime sin milisegundos SELECT CONVERT(VARCHAR(9), CURRENT_TIMESTAMP, 108); ¿Se os ocurre algún otro formato más?

SQL Server 2008 registro de transacciones

Imagen
El registro de transacciones en SQL Server es el archivo que registra como bien dice su nombre todas las transacciones de una tabla y sus modificaciones en la base de datos y si no le ponemos un límite al mismo este crecerá de manera indefinida llegando incluso a colapsar todo el espacio libre de nuestro almacenamiento. La recomendación de Microsoft es la siguiente: El registro de transacciones se debe truncar periódicamente para evitar que se llene. Sin embargo, algunos factores pueden retrasar el truncamiento del registro, por lo que es importante supervisar el tamaño del registro. Algunas operaciones se pueden registrar mínimamente para reducir su impacto sobre el tamaño del registro de transacciones. ¿Cómo saber el espacio ocupado por cada registro de transacciones? Ejecutamos la siguiente consulta: DBCC SQLPERF(LOGSPACE); Esto nos devolverá una tabla con los siguientes campos: nombre de la base de datos, tamaño del log en MB, espacio del log utilizado en porcentaje y el est...

Error Unable to connect to server mssql_connect()

Una de las desventajas de intentar conectar PHP con SQL Server desde linux es tener que utilizar la librería mssql. Esta librería si de algo es escasa es de mostrar errores con los cual cuando tenemos el error Warning: mssql_connect() [function.mssql-connect]: Unable to connect to server lo único que queremos es poner el grito en el cielo porque no sabemos el motivo como tal. Como expliqué en el post Acceder desde Linux a SQL Server con PHP para instalar esta librería es necesario instalar previamente FreeTDS y esta desde la versión 0.6 viene con una utilidad llamada tsql que nos permitirá conectarnos al servidor SQL y en caso de fallo nos dará errores mucho más descriptivos. Lo que tenemos que hacer es entrar como root a la consola de nuestro servidor y ejecutar el comando tsql, en caso del siguiente error tsql: command not found la solución es simple, hay primero que comprobar que existe el archivo y segundo incluir la ruta en la variable global PATH de linux. El archivo...

Optimizar Navision en SQL Server

Imagen
Estas son algunas pautas a tener en cuenta para optimizar la base de datos de Microsoft Dynamics Nav (Navision) en Microsoft SQL Server. Dynamics NAV Default Isolation Level Con el lanzamiento de Microsoft Dynamics NAV 5.00 SP1 (Build 30482 / KB 979135) y posteriores tenemos la opción de cambiar el nivel de aislamiento predeterminado de NAV de SERIALIZABLE a REPEATABLEREAD. SERIALIZABLE: Este es el nivel de aislamiento más restrictivo. Cuando se utiliza, los valores fantasmas no pueden ocurrir pues impide que otros usuarios actualicen o inserten filas en el conjunto de datos hasta que la transacción se complete. REPEATABLEREAD: Cuando se utiliza, las lecturas ‘sucias’ y no repetibles no pueden ocurrir. Esto significa que los bloqueos se colocarán en todos los datos que se utilizan en una consulta y otra transacción no puede actualizarlos. En resumen SERIALIZABLE es más restrictiva y bloquea más registros que REPEATABLEREAD que puede causar más tiempos de espera de bloqueos y desb...

Recomendaciones respecto a SQL Server

Imagen
Estas son algunas recomendaciones que me pasaron hace un tiempo sobre parámetros para optimizar SQL Server, en realidad son la traducción de esas recomendaciones, espero que os sirvan de ayuda, a mi la verdad no mucho. Auto-Grow Auto-Growths (Auto-crecimientos) de la base de datos o del registro de transacciones en entornos de producción puede degradar el rendimiento pues todas las transacciones deben hacer cola y esperar al SQL Server para hacer crecer el archivo de registro o de datos antes de que pueda comenzar a procesar las transacciones de nuevo. Esto puede crear un cuello de botella. Recomendamos fuertemente el crecimiento de los datos y del archivo de registro durante las horas pico entre un 10 a 25% del tamaño actual. No recomendamos desactivar Auto-Grow pues en casos de emergencia es mejor tenerlo activado que quedarse sin espacio y poner la base de datos fuera de servicio. Trace Flag 4119 Si está ejecutando SQL Server 2005, le recomendamos que active el indicador de tr...