Error en Formato de Fechas SQL SERVER

Error en Formato de Fechas SQL SERVER 


En algunas ocasiones al realizar una consulta hacia nuestro servidor de base de datos tenemos un error de formato de fecha, esto se puede deber a que el lenguaje que está definido en nuestro servidor no concuerda con nuestras consultas enviadas.

Para solucionar este error te dejo unas instrucciones que yo utilicé en SQL Server 2008, 2012 y 2014.  No he probado estas instrucciones en otras versiones de SQL server pero puedes intentar realizarlas y dejarme tus comentarios.

Procedimiento para solucionar el error de Formato de Fechas en SQL Server:

-- Con esta instrucción Verificamos el lenguaje que tiene establecido actualmente nuestro servidor de SQL Server en la opción 'Languaje'
DBCC USEROPTIONS

Nos mostrará algo así:



-- Ahora si queremos ver las opciones de lenguajes que existen en nuestro servidor podemos revisarlo con la siguiente instrucción:
SELECT * FROM SYS.SYSLANGUAGES

-- esto nos desplegará un listado como el siguiente
Error de Formato de Fechas en SQL SERVER


-- Una vez elegido el id del lenguaje que deseamos establecer como default en una determinada base de datos ejecutamos la siguiente instrucción 
Use MiBaseDeDatos

--Nota: para poder ejecutar las instrucciones debemos iniciar sesión con el Usuario SA o con un usuario que tenga permisos altos nuestro servidor de SQL SERVER

EXEC SP_CONFIGURE 'DEFAULT LANGUAGE', 0 ;
GO
RECONFIGURE ;

-- Tal vez también será necesario que cambies el lenguaje del usuario con el que ejecutas tus consultas a la base de datos

-- ESTE SEGUNDO ES PARA CAMBIAR EL LENGUAJE POR DEFAULT DE UN USUARIO EN PARTICULAR
EXEC SP_DEFAULTLANGUAGE 'MiUsuario', 'US_ENGLISH';

GO
RECONFIGURE;

Espero que te sirvan estas sencillas instrucciones para solucionar el error de formato de fechas en SQL Server.

Si deseas que en esta página se compartan temas específicos de SQL entonces por favor deja un comentario al Final de este artículo.

Mis Mejores Saludos
Xavier García



Error Distribuited Transactions SQL SERVER

Error en Transacciones Distribuidas de SQL SERVER

En algunas ocasiones se nos presenta un Error cuando queremos realizar consultas entre un servidor de base de datos de SQL server hacia otro servidor vinculado.

Error Distribuited Transactions SQL SERVER 

Para soluciona este error vemos varias soluciones en otras páginas refiriéndose a modificar los permisos en la Parte DTC (distribuited transactions coordinator) de nuestro servidor de base de datos y del servidor de bases de datos vinculado.

Así es como debe estar configurada esta opción en los servidores que vayan a participar en consultas de SLQ SERVER

ERROR Distribuited Transactions Coordinator SQL SERVER

Si ya tienes esta configuración y aún así te sigue mandando el Error Distribuited Transactions SQL SERVER entonces utiliza las siguientes instrucciones en una ventana de Query Analyzer. de SQL SERVER.

Nota: debes ejecutar las instrucciones tanto en el servidor 1 como en el servidor 2

En el Servidor 1 ejecutarás:
eXEC sp_serveroption @server = 'miservidor2',@optname = 'remote proc transaction promotion', @optvalue = 'false' ;

En el Servidor 2 ejecutarás:
EXEC sp_serveroption @server = 'miservidor1',@optname = 'remote proc transaction promotion', @optvalue = 'false' ;

Espero que te ayuden estas pequeñas instrucciones para eliminar este molesto error de transacciones distribuidas en SQL SERVER a mi en lo particular me libraron de muchas horas de incertidumbre.


Mis Mejores Saludos
Xavier García


Shrink - Truncar o Reducir LOG de una Base de Datos SQL SERVER

Shrink - Truncar o Reducir LOG de una Base de Datos SQL SERVER

Las siguientes sentencias o instrucciones para truncar el log de una base de datos en SQL Server funcionan en SQL Server a partir en su versión 2008

.primero nos conectamos al editor de SQL Server con credenciales de usuario SA (administrativo)
nos conectamos a la base de datos Master.

1.-  
Use Master
ALTER DATABASE MiBasedeDatos SET RECOVERY SIMPLE WITH NO_WAIT

-- Ahora nos cambiamos a la base de datos con
Use MiBasedeDatos

2.-
-- truncamos el archivo log de la base de datos
GO
DBCC SHRINKFILE('MiBasedeDatos_Log', 0)

         En caso de que no sepamos como se llama nuestro archivo de log de transacciones lo podemos            obtener con la siguiente consulta:

      select *
      from sysfiles

      nos dará un resultado como el siguiente:
Shrink - Truncar o Reducir LOG de una Base de Datos SQL SERVER


3.-
-- Como último paso realizamos lo siguiente:
USE [master]
GO
ALTER DATABASE MiBasedeDatos SET RECOVERY FULL WITH NO_WAIT


Para hacer Shrink o Truncar (Reducir) el Log en Una base de Datos Sql Server 2005 o 2000 

Se utilizan las siguientes instrucciones:

USE MiBasedeDatos 

BACKUP  LOG MiBasedeDatos WITH TRUNCATE_ONLY
después de esto hay que ejecutar el siguiente comando

DBCC SHRINKFILE(pubs_log,2) 


Mis Mejores Saludos

CONSULTAS DINAMICAS EN SQL SERVER

COMO REALIZAR CONSULTAS DINAMICAS EN SQL SERVER

Una de las Más grandes utilidades de lenguaje de base de datos SQL Server consiste en las consultas dinámicas.

¿Qué es una consulta dinámica en SQL SERVER?
Una consulta dinámica es aquella que puede irse armando o formando según la necesidad de la información a extraer, en donde puede variar absolutamente todo; los campos de la parte del select, la condicionante en la parte del where, el ordenamiento en la parte del order by en fin, es una consulta 100% dinámica.

Ejemplos de Consulta Dinámica en SQL SERVER

Vamos a lo que nos interesa, como armar o cómo utilizar esta excelente opción de SQL SERVER.

Primero tenemos que declarar Una Variables de tipo NVarchar de longitud 4000, hasta el momento esta es la máxima longitud que se permite en una variable que se ocupará para realizar una consulta dinámica.

DECLARE @QUERY AS NVARCHAR(4000)
SET @QUERY = ''

Después iremos armando a necesidad la consulta, por ejemplo, traer los operadores que tengan más de 2 hijos

DECLARE @QUERY AS NVARCHAR(4000)
SET @QUERY = ''

SET @QUERY = @QUERY +  ' SELECT * '
SET @QUERY = @QUERY +  ' FROM EMPLEADOS AS EMP  '
SET @QUERY = @QUERY +  ' INNER JOIN CANTIDAD_HIJOS AS CH ON '
SET @QUERY = @QUERY +  ' EMP.ID_EMPLEADO = CH.ID_EMPLEADO '
SET @QUERY = @QUERY +  ' WHERE CH.HIJOS > 2 '

EXEC SP_EXECUTESQL @QUERY

El resultado será el siguiente:
Consultas Dinámicas en SQL SERVER


Ahora, vamos a cambiar la condicionante de cantidad de hijos para pasarlo como un parámetro y para que no quede fijo en la consulta, para ello declaramos la variable que utilizamos como parámetro:

DECLARE @QUERY AS NVARCHAR(4000)
DECLARE @HIJOS AS INT -- declaramos la variable
SET @QUERY = '' 

SET @HIJOS = 2 -- le ponemos un valor a la variable

SET @QUERY = @QUERY +  ' SELECT * '
SET @QUERY = @QUERY +  ' FROM EMPLEADOS AS EMP  '
SET @QUERY = @QUERY +  ' INNER JOIN CANTIDAD_HIJOS AS CH ON '
SET @QUERY = @QUERY +  ' EMP.ID_EMPLEADO = CH.ID_EMPLEADO '
SET @QUERY = @QUERY +  ' WHERE CH.HIJOS > @HIJOS ' -- ponemos la variable dentro del query dinámico

EXEC SP_EXECUTESQL @QUERY , N'@HIJOS AS INT', @HIJOS -- de esta manera pasamos el parámetro a la consulta dinámica

esto nos proporcionará el mismo resultado de arriba:

Consultas dinámicas en SQL Server imagen 2

¿Cómo podemos pasar más de un parámetro a una consulta dinámica?

Seguramente nos veremos en la necesidad de pasar más de un parámetro a la consulta dinámica, no  hay mucho problema, solo debemos declararla al inicio y después anexarla en la ejecución de la consulta, es decir, en la parte del EXEC SP_EXECUTESQL

Ejemplo:
Digamos que ahora requerimos obtener el empleado que tenga más de 1 hijo y que se llame JUAN

DECLARE @QUERY AS NVARCHAR(4000)
DECLARE @HIJOS AS INT
DECLARE @NOMBRE AS VARCHAR(50) -- Declaramos el Segundo parámetro
SET @QUERY = ''

SET @HIJOS = 1
SET @NOMBRE = 'JUAN' -- Le Asignamos un Valor

SET @QUERY = @QUERY +  ' SELECT * '
SET @QUERY = @QUERY +  ' FROM EMPLEADOS AS EMP  '
SET @QUERY = @QUERY +  ' INNER JOIN CANTIDAD_HIJOS AS CH ON '
SET @QUERY = @QUERY +  ' EMP.ID_EMPLEADO = CH.ID_EMPLEADO '
SET @QUERY = @QUERY +  ' WHERE  CH.HIJOS > @HIJOS  AND '
SET @QUERY = @QUERY +  ' EMP.NOMBRE = @NOMBRE   ' -- Lo ponemos dentro de la conslta dinámica

EXEC SP_EXECUTESQL @QUERY , N'@HIJOS AS INT, @NOMBRE AS VARCHAR(50) ', @HIJOS, @NOMBRE -- Lo Anexamos dentro de la parte de Ejecución

Resultado:
Pasando más de un Parámetro a una consulta Dinámica

Ten en cuenta que puedes cambiar cualquier parte de una consulta dinámica en base a tus necesidades.

Gracias por tu Visita.
Mis Mejores Saludos
Xavier García

Uso de SubConsultas en SQL Server (SubQueries)

Subconsultas o SubQueries en SQL Server

Muchas veces no vemos en la necesidad de Realizar una consulta de datos dentro de otra consulta ya creada, a lo que se le llama SubConsultas ó SubQueries. Pondré algunos ejemplos del uso de subconsultas a continuación.

SubConsulta sencilla para traer la descripción de puesto de un empleado:


Digamos que una consulta sobre la tabla empleados nos devuelve los siquientes resultados:

SELECT * 
FROM EMPLEADOS

Subconsultas o SubQueries SQL SERVER 1

Y también tenemos la tabla Puestos, la cuál contiene los siguientes Valores.

SELECT *
FROM PUESTOS

subqueries SQL SERVER

Ahora, digamos que cuando consultemos la tabla de empleados queremos que nos aparezca la descripción del puesto, obviamente esto lo podemos hacer relacionando la tabla de empleados con la tabla puestos por el campo id_puesto pero en este ejemplo estamos tratando de demostrar el uso de las subconsultas en sql server, entonces quedaría de esta forma:

SELECT EMP.ID_EMPLEADO, EMP.NOMBRE, EMP.FECHA_INGRESO, 
(SELECT P.DESCRIPCION 
                  FROM PUESTOS P 
                 WHERE P.ID_PUESTO = EMP.ID_PUESTO) AS DESCRIPCION_PUESTO
FROM EMPLEADOS AS EMP

El resultado es el siguiente:

EJEMPLO de SubConsultas en SQL SERVER


Uso de Subconsultas como Tablas Temporales

Algunas veces es recomendable utilizar subconsultas para evitar crear tablas temporales, es decir que el resultado de una consulta lo podemos como si fuera un tabla temporal, ejemplo:

Vamos a utilizar el query creado en el ejemplo anterior como si fuera una tabla temporal:

SELECT *
FROM (
SELECT EMP.ID_EMPLEADO, EMP.NOMBRE, EMP.FECHA_INGRESO, 
(SELECT P.DESCRIPCION 
                  FROM PUESTOS P 
                 WHERE P.ID_PUESTO = EMP.ID_PUESTO) AS DESCRIPCION_PUESTO
FROM EMPLEADOS AS EMP) AS TABLA_TEMPORAL

solo pusimos todo el query anterior dentro de parentesis () y al final un alias que es como se llamará la supuesta tabla temporal.

Mis Mejores Saludos
Xavier García


Explicación y Diferencia del uso de Inner Join en SQL

USO DE INNER JOIN

Seguramente has notado que algunas consultas están formadas por varias tablas de datos, y para enlazar estas tablas de datos se utuliza la sentencia INNER JOIN 

También habrás visto consultas que están formadas por varias tablas de datos, y para enlazar estas tablas de datos no se utiliza la sentencia INNER JOIN

Ejemplo de relación de tablas CON Inner Join

SELECT * 
FROM EMPLEADOS AS EMP 
INNER JOIN CANTIDAD_HIJOS AS CH ON

EMP.ID_EMPLEADO = CH.ID_EMPLEADO

Nos mostrará el siguiente resultado
Inner Join Ejemplo



Cuando utilizamos la sentencia de relación INNER JOIN la relación de los campos se realiza después de la palabra ON y en esta consulta no utilizamos WHERE


Ejemplo de relación de tablas SIN Inner join

SELECT * 
FROM EMPLEADOS AS EMP, CANTIDAD_HIJOS AS CH 

WHERE EMP.ID_EMPLEADO = CH.ID_EMPLEADO

esta consulta nos devuelve el mismo resultado:


para la segunda forma la relación de los campos se realiza después de la palabra WHERE y en esta consulta separamos los nombres de las tablas por una coma 


Te pongo un EJEMPLO DE INNER JOIN  enlazando más de dos tablas y utilizando una condicionante en el WHERE.


SELECT * 
FROM EMPLEADOS AS EMP 
INNER JOIN CANTIDAD_HIJOS AS CH ON
EMP.ID_EMPLEADO = CH.ID_EMPLEADO
INNER JOIN SUELDO_EMPLEADO AS SE ON
EMP.ID_EMPLEADO = SE.ID_EMPLEADO
WHERE SE.SUELDO > 15000

Estamos enlazando 3 Tablas, EMPLEADOS ,  CANTIDAD_HIJOS y SUELDO_EMPLEADO 
y en la condicinante WHERE estamos diciendo que solo nos traiga aquellos empleados cuyo sueldo sea mayor a 15000.

ejemplo de Inner Join con 3 tablas



Mis Mejores Saludos
Xavier García




Error al Restaurar una Base de Datos

Después de hacer una Restauración de una base de datos es probable que nos topemos con que no podemos accesar a dicha base de datos y se nos muestre un error como el siguiente:

"The table either does not exist or the current user does not have permissions on that table"

"La entidad de seguridad de servidor "usuario" no puede tener acceso a la base de datos "MI_BASE_DE_DATOS" en el contexto de seguridad actual."

"La base de Datos no está Accesible"

Esto es debido a que el propietario (owner) de nuestra base de datos quedó des-asignado  de la base de datos que fue restaurada. Lo que algunos llaman "Usuario Huerfano"

La solución es sencilla:

primero que nada debes loguearte a tu servidor de bases de datos con el usuario SA una vez logueado Ejecuta el siguiente Stored prodedure en la base de datos que quedó con el problema de usuario:

USE MI_BASE_DE_DATOS
SP_CHANGE_USERS_LOGIN 'REPORT'

El resultado serán los usuarios huérfanos de la bd:
usuario huerfano acceso base de datos




Ahora, cámbiate a la base de datos Master y ejecutas el siguiente SP sustituyendo los valores de los parámetros por tus valores.

Use Master
exec sp_addlogin @loginame = 'Mi_usuario', @passwd= 'Mi_password', @defdb = 'Mi_Base_De_Datos'

Quizá te marque un error como el siguiente:
La entidad de seguridad de servidor 'Mi_usuario' ya existe.
The server principal 'Mi_usuario' already exists.

No te preocupes, es solamente el paso 1, eso quiere decir que ya existe el usuario en el contexto del servidor. Ahora procedemos a reparar el usuario Huérfano con el siguiente SP. pero antes nos cambiamos a la base de datos que tenía el problema del usuario

Use Mi_Base_De_datos
sp_change_users_login 'Update_One', 'Mi_Usuario', 'Mi_usuario'

Comandos completados correctamente.


para comprobar podemos ejecutar nuevamente la siguiente consulta y ya no debería aparecernos el usuario huérfano.

USE MI_BASE_DE_DATOS
SP_CHANGE_USERS_LOGIN 'REPORT'

Para finalizar, cerramos la sesión del usuario SA y nos volvemos a conectar ahora con el usuario que tenía el problema.


Mis Mejores Saludos
Xavier García