Hoy me he marcado un procedimiento para importar directamente un CSV.
create procedure [dbo].[actualizaStock] @fichero varchar(500), @resultado int out as BEGIN TRANSACTION; BEGIN TRY -- si existe la tabla donde haremos la importación, la vaciamos, sino la creamos if exists (select * from sys.tables where name = 'tmp_stock') truncate table tmp_stock else CREATE TABLE dbo.tmp_stock( codproducto varchar(15) NULL, talla varchar(5) NULL, unidades int NULL ) ON [PRIMARY] -- Importamos el fichero, especificando los delimitadores de columna y de fila. -- Se hace con un execute porque al hacer una importación con BULK no podemos poner la ruta como una variable execute ('BULK INSERT dbo.tmp_stock FROM ''' + @fichero + ''' WITH (FIRSTROW = 2, FIELDTERMINATOR = '';'', ROWTERMINATOR = ''\n'')'); -- en este caso actualizamos un stock con los datos que acabamos de importar update s set s.stock = s.stock + t.unidades from stock s inner join tmp_stock t on t.codproducto = s.CodProducto and s.Talla = t.talla -- vamos a guardar los datos importados en una nueva tabla con la fecha del día declare @tabla varchar(50) set @tabla = 'tmp_stock_' + convert(varchar(8), getdate(), 112); -- si ya existe una tabla con el nuevo nombre, la eliminamos if exists (select * from sys.tables where name = @tabla) execute ('drop table ' + @tabla); -- renombramos la tabla que hemos usado para la importación con el nuevo nombre exec sp_RENAME 'tmp_stock' , @tabla END TRY BEGIN CATCH IF @@TRANCOUNT > 0 begin set @resultado = -1 ROLLBACK TRANSACTION; return -1 end END CATCH; IF @@TRANCOUNT > 0 begin set @resultado = 0 COMMIT TRANSACTION; return 0 end
0 Comentarios.