Buscar aquí

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

martes, 1 de febrero de 2011

Insertar desde un archivo de excel en SQL Sever

Para insertar los datos que hay en un archivo de Excel en una tabla de SQL server puede resultar mas fácil de lo que parece.

Primero vamos a usar el archivo de Excel como un Servidor Vinculado.
Un Servidor Vinculado es una definición de una Cadena de Conexión OLEDB y un Proveedor OLEDB que asociamos a un nombre lógico, es decir, nos permite definir un nombre para el servidor vinculado, y a dicho nombre especificarle qué Proveedor OLEDB y qué Cadena de Conexión se debe utilizar para acceder al correspondiente Origen de Datos OLEDB cuando se solicite acceso a dicho Servidor Vinculado. Como hablamos, un Servidor Vinculado sirve para acceder a Orígenes de Datos OLEDB desde SQL Server (es decir, para ejecutar Consultas Distribuidas, ejecutar Procedimientos Almacenados en servidores remotos, etc.). Ver

Para definir el Servidor Vinculado podemos usar el asistente de SQL Server o usar un procedimiento almacenado (lo que a mi me funciono mejor), la sintanxis es:

DECLARE @RC int
DECLARE @server nvarchar(128)
DECLARE @srvproduct nvarchar(128)
DECLARE @provider nvarchar(128)
DECLARE @datasrc nvarchar(4000)
DECLARE @location nvarchar(4000)
DECLARE @provstr nvarchar(4000)
DECLARE @catalog nvarchar(128)
-- Set parameter values
SET @server = 'XLTEST_SP'  -- Nombre para el servidor
SET @srvproduct = 'Excel'  --Nombre del producto
SET @provider = 'Microsoft.Jet.OLEDB.4.0'  --Proveedor
SET @datasrc = 'c:\book1.xls'  --Ruta completa del
--Origen de datos
SET @provstr = 'Excel 8.0'   -- Origen de los datos
EXEC @RC = [master].[dbo].[sp_addlinkedserver] @server,@srvproduct, 
@provider, @datasrc, @location, @provstr, @catalog

Puedes dejar solo igual, y con cambiar el nombre del servidor, @server, por cualquier nombre y @datasrc por la ruta completa donde esta el archivo de Excel.

Al ejecutar esta sentencia en el el Explorador de Objetos se puede encontrar en Objetos del Servidor en Servidores vinculados en Tablas encontraras
las hojas que tenga el archivo y se pueden consultar como tablas con la siguiente sintaxis:

SELECT [F1]
FROM [XLTEST_SP]...[Hoja2$]
GO
Donde XLTEST_SP es el nombre del Servidor Vinculado.

Ya que podemos consultar el archivo como una tabla solo es insertarla normalmente en el destino:

insert into Nintranet.dbo.Empleado_Atributos_Intranet
SELECT *
FROM [XLTEST_SP]...[Hoja2$]
GO


Ver

martes, 11 de enero de 2011

Entradas duplicadas sql server F

Estoy corrigiendo defectos de una aplicación y uno de los que me reportaron me ha dado muchos dolores de cabeza.
Es una aplicación web y cuando un usuario realiza cierta operación que debe generar un registro en una tabla, se generan 2 o 3 entradas duplicadas, con 100 milisegundos de diferencia, lo se por que tengo una columna con un getdate al insertar, además de que queda con diferente id

Tratando de corregir el problema puse una llave compuesta por 4 campos, pero no funciona por la diferencia en milisengundos de la fecha de inserción, y el problema continuaba generando inconsistencias serias en la aplicacion.

Mi solución un trigger, tomo los campos con los que cotrolo la inserción duplicada y dado el caso si se halla duplicado hago un rollback. Asi:


ALTER TRIGGER SOL_REPETIDAS

on Solicitud_vac

AFTER INSERT

AS

BEGIN

-- SET NOCOUNT ON

SET NOCOUNT ON;

DECLARE @fecha_in datetime
DECLaRE @usu_crea varchar(20)
DECLARE @fecha_inicio datetime
declare @sol_id int
select @sol_id=sol_id, @fecha_in = Sol_Fecha, @usu_crea=Sol_Usu_Crea, @fecha_inicio=Sol_Fecha_Ini from inserted
print @fecha_in

--Condicion para determinar un registro similar en la tabla
if((select count( sol_id) from solicitud_vac where DATEDIFF(mi,sol_fecha,@fecha_in) < 4 and sol_usu_crea=@usu_crea and Sol_Fecha_Ini=@fecha_inicio and sol_id <>@sol_id) >0 )
ROLLBACK /*Si se encontraron registros similares se hace un rollback, que echa atras la transaccion, incluyendo el insert, update o delete que lanzo el trigger*/

END

Otra arma en nuestra linea de batalla para evitar inconsistencias.

Bye

sábado, 23 de octubre de 2010

Restaurar base de datos a una con diferente SQL Server

Trabajando en SQL Server 2008 el otro día necesite tener una base de datos de prueba de una que manejo regularmete, hice un back up y me encontre al intentar restaurar con que no podia cambiar el nombre de la base de datos, y que ademas el proceso intentaba situar los archivos de la nueva bd donde estan los de la vieja y pues obviamente la vieja los esta usando. Así que decidi usar el siguiente script que soluciono mi problema:


USE master
GO

RESTORE FILELISTONLY
FROM disk ='C:\Archivos de programa\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\Backup\Vacaciones.bak'

From disk es para poder restaurar nombrando la ubicacion del archivo de back up.

Este primero me muestra los nombre que tiene el back up para los archivos de la bd, me retorno lo siguiente entre otra informacion que ahora no es relevante:


Vacaciones_Data

c:\Archivos de programa\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQLDATA\Vacaciones backup.MDF

Vacaciones_Log

c:\Archivos de programa\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\Vacaciones backup_1.LDF


Vacaciones_idx

c:\Archivos de programa\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\Vacaciones backup_2.LDF

Ahora para restaurar la base de datos use lo siguiente, lo que pone los nuevos archivos donde uno quiera, importante las extensiones:


USE master
GO

RESTORE DATABASE Nintranet --Este es el nombre de la bd de destino, en mi caso no la cree antes de
--ejecutar el script
FROM disk ='C:\Archivos de programa\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\Backup\Vacaciones.bak'
WITH RECOVERY,
MOVE 'Vacaciones_Data' TO 'C:\Vacaciones_Data.mdf',
MOVE 'Vacaciones_Log' TO 'C:\Vacaciones_Log.ldf',
MOVE 'Vacaciones_idx' TO 'C:\Vacaciones_Log_2.ldf'
GO

Gracias.