Mostrando entradas con la etiqueta asesoria sql. Mostrar todas las entradas
Mostrando entradas con la etiqueta asesoria sql. Mostrar todas las entradas

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

Como Hacer un Left Join en SQL Server

En este artículo te explico Como hacer un Left Join en Sql Server,

Un Left Join en SQL significa que al cruzar dos tablas A (Izquierda) y B (Derecha) nos interesa que todos los resultados de la tabla A se obtengan aunque algunos resultados de B no coincidan al relacionar las dos tablas por el campo relacionado.

Pero como es dificil entenderlo con Teoría voy a explicarlo con un caso práctico.

Tenemos la tabla Empleados que contiene el ID de los Empleados y su nombre:

Como hacer un Left Join en SQL Server

Por otra parte tenemos la tabla Cantidad_Hijos en la que se almacena el ID del empleado y la cantidad de hijos que tiene cada uno de los empleados (si es que tienen hijos, )


Al realizar un Left Join de la tabla empleados con la tabla Cantidad_Hijos, relacionándolos por el campo en común id_empleado este sería el resultado:

Resultado de Left Join

Como puedes ver en el ejemplo en la tabla empleados se dieron de alta 4 personas, sin embargo el empleado con el id 4  (Lucas) no tiene hijos, entonces en la tabla cantidad_hijos no existe su id, es por eso que en el resultado del left join el campo id_empleado y el campo hijos aparecen con valor NULL

Te dejo el script para que puedas crear las tablas y realizar el ejemplo por ti mismo:

-- CREANDO LA TABLA EMPLEADOS
CREATE TABLE EMPLEADOS(
ID_EMPLEADO INT NOT NULL,
NOMBRE VARCHAR(100) NOT NULL)

-- AÑADIENDO VALORES A LA TABLAS EMPLEADOS
INSERT INTO EMPLEADOS SELECT 1 , 'JUAN'
INSERT INTO EMPLEADOS SELECT 2 , 'PEDRO'
INSERT INTO EMPLEADOS SELECT 3 , 'JACINTO'
INSERT INTO EMPLEADOS SELECT 4 , 'LUCAS'

-- CREANDO LA TABLA CANTIDAD_HIJOS
CREATE TABLE CANTIDAD_HIJOS(
ID_EMPLEADO INT NOT NULL,
HIJOS INT NOT NULL)

-- AÑADIENDO VALORES A LA TABLAS CANTIDAD_HIJOS
INSERT INTO CANTIDAD_HIJOS SELECT 1 ,2
INSERT INTO CANTIDAD_HIJOS SELECT 2 ,1
INSERT INTO CANTIDAD_HIJOS SELECT 3 ,3

-- APLICANDO EL LEFT JOIN 
SELECT E.*, CH.*
FROM EMPLEADOS AS E LEFT JOIN 
CANTIDAD_HIJOS AS CH ON
E.ID_EMPLEADO = CH.ID_EMPLEADO


Como hacer un Left Join en Sql Server