logoff | Дата: Среда, 15.02.2012, 15:22 | Сообщение # 1 |
Тамбов
Группа: Администраторы
Сообщений: 655
Репутация: 19
Статус: Offline
| Внимание! Данный скрипт так же существует в версии для Google Doc проверен на среде SQL staandart вероятнее всего будет работать и на MSDE
Code use bn -- работа с таблицей BN go SET XACT_ABORT ON; BEGIN TRAN T1; -- работа с транзакцией - если что пойдет не так, записи не будут произведены
if object_id('tempdb..#temp') is not null drop table #temp create table #temp (code varchar(16), type_AT varchar(16), tel varchar(20), opt_int1 int, opt_int2 int, InstallDate varchar(30), RunByTrack varchar(10), ObjectGarNum varchar(20), ObjectGosNum varchar(20), max_speed int, org_name varchar(200), mark_name varchar(50) ) --создадим временную таблицу с тремя колонками -- как в таблице FLEET_Object
---create table #temp (code varchar(16)) --создадим временную таблицу с одной колонкой
BULK INSERT #temp -- вставка из файла во временную таблицу FROM 'c:\1\7.csv' -- из файла с указанным именем и путем WITH ( FIELDTERMINATOR=';', -- разделитель полей - exel именно с ним выгружает FIRSTROW = 1, -- с номера строки строки ROWTERMINATOR = '\n', -- разделитель строк enter codepage = 'acp' )
select * from #temp -- 0. Добавление названий марок и организаций из temp -- 1. апдейт приборов, что есть уже в БД -- 2. создание приборов, что еще нет -- 3. апдейт всех машин, что привязаны к приборам которых нет -- 4. создание машин, которых нет -- 5. радоваться жизни -- приборы идентифицировать по полю code и d.DeviceActive=1 -- марки по name, организации по name -- type_AT числовой, проверяется по dbo.SYS_DEV_DeviceType.id - должна быть запись там
-- 0. добавление марок и организаций
-- 0.0 марки print 'вставка марки' insert into bn.dbo.FLEET_MarkCar (MarkCarName,MarkCarType) select distinct mark_name, 2 -- грузовой from #temp as t left join bn.dbo.FLEET_MarkCar as m on m.MarkCarName=t.mark_name where m.MarkCarID is null -- 0.1 организации print 'вставка орагнизации' insert into bn.dbo.SYS_OrgRequisite (ShortName,name) select org_name, org_name -- грузовой from (select distinct org_name from #temp) as t left join bn.dbo.SYS_OrgRequisite as o on o.name=t.org_name where o.id is null
declare @device_id int, @type_AT int,@code varchar(16),@opt_int1 int,@opt_int2 int,@tel char(50),@RunByTrack bit, @InstallDate datetime
-- 1. апдейт приборов, что уже есть print 'обновление приборов' -- обновим через курсор, ибо есть тригеры на обновление девайсов declare cur cursor local for select d.id, t.type_AT, t.opt_int1,t.opt_int2,t.tel,t.RunByTrack,cast(t.InstallDate as datetime) from bn.dbo.SYS_DEV_Device as d inner join #temp as t on t.code=d.code and d.DeviceActive=1
open cur while 1=1 begin fetch next from cur into @device_id,@type_AT,@opt_int1,@opt_int2,@tel,@RunByTrack,@InstallDate if @@FETCH_STATUS!=0 break -- прервать цикл update bn.dbo.SYS_DEV_Device set type_id=@type_AT,opt_int1=@opt_int1,opt_int2=@opt_int2,tel_number=@tel,RunByTrack=@RunByTrack,InstallDate=@InstallDate where @device_id=id end
close cur deallocate cur
-- 2. создание приборов, что уже есть print 'создание приборов' -- сделаем через курсор, ибо тогда для приборов заполянтся данные о датчиках и командях
declare cur cursor local for select type_AT,t.code,t.opt_int1,t.opt_int2,t.tel,t.RunByTrack,cast(t.InstallDate as datetime) from #temp as t left join bn.dbo.SYS_DEV_Device as d on d.code=t.code and d.DeviceActive=1 where d.id is null ;
open cur while 1=1 begin fetch next from cur into @type_AT,@code,@opt_int1,@opt_int2,@tel,@RunByTrack,@InstallDate if @@FETCH_STATUS!=0 break -- прервать цикл insert into bn.dbo.SYS_DEV_Device (type_id,code,opt_int1,opt_int2,tel_number,RunByTrack,InstallDate,DeviceActive,opt_int3) values (@type_AT,@code,@opt_int1,@opt_int2,@tel,@RunByTrack,@InstallDate,1,0) end
close cur deallocate cur
-- 3. апдейт всех машин, что привязаны к приборам которых нет
print 'обновление ТС' -- найдем ТС, которые прицеплены к приборам и их все обновим данными update O set MarkCarID=m.MarkCarID, ObjectGarNum=t.ObjectGarNum, ObjectGosNum=t.ObjectGosNum, OrganizationId=org.id, ObjectMaxSpeed=t.max_speed
from bn.dbo.FLEET_Object as O inner join bn.dbo.SYS_DEV_Device as d on d.id=o.Device_ID and d.DeviceActive=1 inner join #temp as t on t.code=d.code and d.DeviceActive=1 inner join bn.dbo.FLEET_MarkCar as M on m.MarkCarName=t.mark_name inner join dbo.SYS_OrgRequisite as org on org.name=t.org_name where o.ObjectActive=1
-- 4. создание машин, которых нет print 'создание ТС, где не привязаны'
insert into bn.dbo.FLEET_Object (MarkCarID, ObjectGarNum, ObjectGosNum, OrganizationId, ObjectMaxSpeed, Device_ID, ObjectActive ) select m.MarkCarID, t.ObjectGarNum, t.ObjectGosNum, org.id, t.max_speed, d.id, 1 from bn.dbo.SYS_DEV_Device as d inner join #temp as t on t.code=d.code and d.DeviceActive=1 inner join bn.dbo.FLEET_MarkCar as M on m.MarkCarName=t.mark_name inner join dbo.SYS_OrgRequisite as org on org.name=t.org_name left join bn.dbo.FLEET_Object as o on o.device_id=d.id and o.ObjectActive=1 where o.ObjectID is null and d.DeviceActive=1
drop table #temp -- удаление временной таблицы
insert into sys_dev_currentdata ([device_id],[device_code] ,[ObjectID]) select d.id, d.code, o.objectid from sys_dev_device as d inner join fleet_object as o on o.device_id=d.id left join sys_dev_currentdata as cd on cd.device_id=d.id where o.objectactive=1 and d.deviceactive=1 and cd.id is null
commit tran t1 -- фиксации транзакции
пример файла для загрузки в приложении, название колонок http://bnc.ucoz.net/_fr/0/format.csv информация в колонке type_AT (вторая) должна соответствовать коду типа прибора (25 - M2M Cyber GLX) список кодов можно посмотреть так: Code /****** Сценарий для команды SelectTopNRows среды SSMS ******/ SELECT [id] ,[name] FROM [BN].[dbo].[SYS_DEV_DeviceType]
|
|
| |