logoff | Дата: Воскресенье, 30.01.2011, 13:39 | Сообщение # 1 |
Тамбов
Группа: Администраторы
Сообщений: 655
Репутация: 19
Статус: Offline
| Как дополнение к статье "Импорт данных в КиберФлит" Скрипт прозводит загрузку данных из предварительно сформированного файла Среда выполнение: MS SQL Внимание!!! Содержимое базы данных будет ИЗМЕНЕНО!!! Создайте архивную копию ваших данных! Применять на свой страх и риск!!! Code /* скоипт загрузики данных о таррировке, датчиках, приборах и машинах ПЕРЕД ЗАПУСКОМ СКРИПТА СОЗДАЙТЕ АРХИВНУЮ КОПИЮ БАЗЫ!!!! ПЕРЕД ЗАПУСКОМ СКРИПТА СОЗДАЙТЕ АРХИВНУЮ КОПИЮ БАЗЫ!!!! ПЕРЕД ЗАПУСКОМ СКРИПТА СОЗДАЙТЕ АРХИВНУЮ КОПИЮ БАЗЫ!!!!
Скрипт обновляет и при необходимости создает данные - АТ идентификация по коду прибора - Транспорт идентификация по коду прибора и deviceactive=1 - Датчик - идентификация по номеру, типу (аналоговый\цифровой) и коду прибора - тарировка идентификация по датчику
при загрузке таррировки все данные о ней полностью очищаются для загружаемых приборов Загрузка идет из файл FROM 'd:\55.csv' -- из файла !!!! исправлять тут который выгружается скриптом части 1 */ use bn -- работа с таблицей BN go
if (not object_id('tempdb..#temp') IS NULL) drop table #temp
if (not object_id('tempdb..#object') IS NULL) drop table #object
if (not object_id('tempdb..#sens') IS NULL) drop table #sens
if (not object_id('tempdb..#device') IS NULL) drop table #device
--BEGIN TRAN T1; -- работа с транзакцией - если что пойдет не так, записи не будут произведены -- временная таблица для файла create table #temp (AT_IDSensor varchar(16), AT_MinValue_Real varchar(16) NULL, AT_MaxValue_Real varchar(16) NULL, AT_MinValue_Tar varchar(16) NULL, AT_MaxValue_Tar varchar(16) NULL, S_device_id varchar(16) NULL, S_num varchar(16) NULL, s_sensor_type_id varchar(16) NULL, s_IsAlarm varchar(16), s_description varchar(128), s_IconID varchar(16), s_SensFuelConsWin varchar(16), s_SensFuelConsSum varchar(16), s_SaveAsEvent varchar(16), s_SensValue varchar(16), s_priority varchar(16), s_Units varchar(24), s_SensorActive varchar(16), s_HasOwnTank varchar(16), s_MinValue varchar(16), s_MaxValue varchar(16), s_SensorClassificationId varchar(16), s_ObjectExtStatusID varchar(16), s_MapColor varchar(16), s_TableColor varchar(16), s_SignFontName varchar(20), s_SignCharCode varchar(16), s_tele_time varchar(32), s_progress_total varchar(16), D_id varchar(16), d_type_id varchar(16), d_code varchar(16), d_name varchar(32), d_opt_int1 varchar(16), d_opt_int2 varchar(16), d_opt_int3 varchar(16), d_tel_number char (50), d_IsGSM varchar(16), d_SimNum varchar(16), O_ObjectID varchar(16), O_MarkCarID varchar(16), O_ObjectGarNum varchar(20), O_ObjectGosNum varchar(20), O_ObjectType varchar(40), O_ObjectVIN varchar(20), O_ObjectNumMotor varchar(20), O_ObjectNumChass varchar(20), O_ObjectNumColum varchar(16), O_ObjectGarTrailerNum varchar(20), O_ObjectGOSTrailerNum varchar(20), O_ObjectOSAGOCode varchar(20), O_ObjectLicenCardNum varchar(20), O_ObjectLicenCardRegNum varchar(20), O_ObjectLicenCardSeria varchar(20), O_ObjectLicenCardType varchar(16), O_ObjectNumBody varchar(20), o_IgnitionSensorID varchar(16), O_DynamicTracePointCnt varchar(16), O_RefuelingThreshold varchar(16) ) -- -- чтение файла BULK INSERT #temp -- вставка из файла во временную таблицу FROM 'd:\55.csv' -- из файла !!!! исправлять тут WITH ( FIELDTERMINATOR=';', -- разделитель полей - exel именно с ним выгружает FIRSTROW = 1, -- с первой строки ROWTERMINATOR = '\n' -- разделитель строк enter )
--select * from #temp
-- временная таблица для машин из файла
create table #object ( d_code varchar(16), O_ObjectID varchar(16), O_MarkCarID varchar(16), O_ObjectGarNum varchar(20), O_ObjectGosNum varchar(20), O_ObjectType varchar(40), O_ObjectVIN varchar(20), O_ObjectNumMotor varchar(20), O_ObjectNumChass varchar(20), O_ObjectNumColum varchar(16), O_ObjectGarTrailerNum varchar(20), O_ObjectGOSTrailerNum varchar(20), O_ObjectOSAGOCode varchar(20), O_ObjectLicenCardNum varchar(20), O_ObjectLicenCardRegNum varchar(20), O_ObjectLicenCardSeria varchar(20), O_ObjectLicenCardType varchar(16), O_ObjectNumBody varchar(20), o_IgnitionSensorID varchar(16), O_DynamicTracePointCnt varchar(16), O_RefuelingThreshold varchar(16))
-- заполнение временной таблицы машин из файла insert into #object ( d_code, O_ObjectID , O_MarkCarID , O_ObjectGarNum , O_ObjectGosNum , O_ObjectType , O_ObjectVIN , O_ObjectNumMotor , O_ObjectNumChass, O_ObjectNumColum , O_ObjectGarTrailerNum , O_ObjectGOSTrailerNum , O_ObjectOSAGOCode , O_ObjectLicenCardNum , O_ObjectLicenCardRegNum, O_ObjectLicenCardSeria, O_ObjectLicenCardType , O_ObjectNumBody, o_IgnitionSensorID , O_DynamicTracePointCnt, O_RefuelingThreshold ) select DISTINCT d_code, O_ObjectID , O_MarkCarID , O_ObjectGarNum , O_ObjectGosNum , O_ObjectType , O_ObjectVIN , O_ObjectNumMotor , O_ObjectNumChass, O_ObjectNumColum , O_ObjectGarTrailerNum , O_ObjectGOSTrailerNum , O_ObjectOSAGOCode , O_ObjectLicenCardNum , O_ObjectLicenCardRegNum, O_ObjectLicenCardSeria, O_ObjectLicenCardType , O_ObjectNumBody, o_IgnitionSensorID , O_DynamicTracePointCnt, O_RefuelingThreshold from #temp
-- временная таблица сенсоров create table #sens -- таблица сенсоров с привязкой к приборам (S_device_id varchar(16) NULL, S_num varchar(16) NULL, s_sensor_type_id varchar(16) NULL, s_IsAlarm varchar(16), s_description varchar(128), s_IconID varchar(16), s_SensFuelConsWin varchar(16), s_SensFuelConsSum varchar(16), s_SaveAsEvent varchar(16), s_SensValue varchar(16), s_priority varchar(16), s_Units varchar(24), s_SensorActive varchar(16), s_HasOwnTank varchar(16), s_MinValue varchar(16), s_MaxValue varchar(16), s_SensorClassificationId varchar(16), s_ObjectExtStatusID varchar(16), s_MapColor varchar(16), s_TableColor varchar(16), s_SignFontName varchar(20), s_SignCharCode varchar(16), s_tele_time varchar(32), s_progress_total varchar(16), d_code varchar(16) ) -- заполнение временной таблицы сенсоров
insert into #sens ( S_device_id , S_num , s_sensor_type_id , s_IsAlarm , s_description , s_IconID , s_SensFuelConsWin , s_SensFuelConsSum, s_SaveAsEvent , s_SensValue , s_priority , s_Units , s_SensorActive , s_HasOwnTank, s_MinValue , s_MaxValue , s_SensorClassificationId, s_ObjectExtStatusID , s_MapColor , s_TableColor , s_SignFontName, s_SignCharCode , s_tele_time, s_progress_total, d_code) select DISTINCT S_device_id , S_num , s_sensor_type_id , s_IsAlarm , s_description , s_IconID , s_SensFuelConsWin , s_SensFuelConsSum, s_SaveAsEvent , s_SensValue , s_priority , s_Units , s_SensorActive , s_HasOwnTank, s_MinValue , s_MaxValue , s_SensorClassificationId, s_ObjectExtStatusID , s_MapColor , s_TableColor , s_SignFontName, s_SignCharCode , s_tele_time, s_progress_total, d_code from #temp
create table #device ( D_id varchar(16), d_type_id varchar(16), d_code varchar(16), d_name varchar(32), d_opt_int1 varchar(16), d_opt_int2 varchar(16), d_opt_int3 varchar(16), d_tel_number char (50), d_IsGSM varchar(16), d_SimNum varchar(16))
insert into #device ( D_id , d_type_id , d_code , d_name , d_opt_int1 , d_opt_int2 , d_opt_int3 , d_tel_number, d_IsGSM , d_SimNum ) select DISTINCT D_id , d_type_id , d_code , d_name , d_opt_int1 , d_opt_int2 , d_opt_int3 , d_tel_number, d_IsGSM , d_SimNum from #temp
-- и так имеем -- таблица #temp - содержит тестовые данные из файла -- таблица #object - список ТС с реквизитами из таблицы #temp -- таблица #device - список приборов с реквизитами из таблицы #temp
-- начнем с таблицы #device -- получим таблицу в курсор для работы declare @device_code varchar(16) declare @device_id int
DECLARE cur CURSOR LOCAL FOR SELECT d_code FROM #device OPEN cur -- открытие курсора FETCH NEXT FROM cur INTO @device_code WHILE (@@FETCH_STATUS = 0) -- цикл BEGIN -- проверка, что девайс существует if not exists ( select * from SYS_DEV_Device TSDD where TSDD.code=@device_code and TSDD.DeviceActive=1 ) begin --insert into SYS_DEV_Device print ('не существует АТ - добавляем') print (@device_code) insert into sys_dev_device -- вставка в список девайсов в указанные колонки (type_id, code, name, opt_int1, -- зн 120 opt_int2, -- зн 120 opt_int3, -- зн 0 tel_number, isgsm, SimNum, DeviceActive) select -- из результата запроса d_type_id, d_code, case d_name when 'NULL' then null else d_name end, case d.d_opt_int1 when 'NULL' then null else cast(d.d_opt_int1 as int) end, -- зн 120 case d.d_opt_int2 when 'NULL' then null else cast(d.d_opt_int2 as int)end, -- зн 120 case d.d_opt_int3 when 'NULL' then null else cast(d.d_opt_int3 as int)end, -- зн 0 case d.d_tel_number when 'NULL' then NULL else d.d_tel_number end, case d.d_isgsm when 'NULL' then NULL else d.d_isgsm end, case d.d_SimNum when 'NULL' then NULL else d.d_SimNum end, 1 as DeviceActive from #device as d-- из таблицы темп where d_code=@device_code
end -- if not exists else begin print ('существует АТ - обновляем') print (@device_code) Update SYS_DEV_Device set type_id=d.d_type_id, name=case d.d_name when 'NULL' then null else d.d_name end, opt_int1=case d.d_opt_int1 when 'NULL' then null else cast(d.d_opt_int1 as int) end, -- зн 120 opt_int2=case d.d_opt_int2 when 'NULL' then null else cast(d.d_opt_int2 as int)end, -- зн 120 opt_int3=case d.d_opt_int3 when 'NULL' then null else cast(d.d_opt_int3 as int)end, -- зн 0 tel_number=case d.d_tel_number when 'NULL' then NULL else d.d_tel_number end, isgsm=case d.d_isgsm when 'NULL' then NULL else d.d_isgsm end, SimNum=case d.d_SimNum when 'NULL' then NULL else d.d_SimNum end from SYS_DEV_Device inner join #device as d on d.d_code=code where code=@device_code and DeviceActive=1 end -- else if not exists -- теперь получаем данные о машине, и обновляем set @device_id=(select id from sys_dev_device where code=@device_code and deviceactive=1) -- проверка, что сущестует объект if not exists ( select * from FLEET_Object O where O.device_id=@device_id and O.ObjectActive=1 ) begin print ('вставка ТС ') insert into FLEET_Object -- вставка в список девайсов в указанные колонки (Device_ID, MarkCarID , ObjectGarNum , ObjectGosNum , ObjectType , ObjectVIN , ObjectNumMotor , ObjectNumChass, ObjectNumColum , ObjectGarTrailerNum , ObjectGOSTrailerNum , ObjectOSAGOCode , ObjectLicenCardNum , ObjectLicenCardRegNum, ObjectLicenCardSeria, ObjectLicenCardType , ObjectNumBody, IgnitionSensorID , DynamicTracePointCnt, RefuelingThreshold, ObjectActive) select -- из результата запроса @device_id, CASE O_MarkCarID WHEN 'NULL' THEN null ELSE cast (O_MarkCarID as int) END, case o_ObjectGarNum when 'NULL' then NULL else o_ObjectGarNum end, case o_ObjectGosNum when 'NULL' then NULL else o_ObjectGosNum end, case o_ObjectType when 'NULL' then NULL else o_ObjectType end, case o_ObjectVIN when 'NULL' then NULL else o_ObjectVIN end , case o_ObjectNumMotor when 'NULL' then NULL else o_ObjectNumMotor end, case o_ObjectNumChass when 'NULL' then NULL else o_ObjectNumChass end, CASE o_ObjectNumColum WHEN 'NULL' THEN null ELSE cast (o_ObjectNumColum as int) END, case o_ObjectGarTrailerNum when 'NULL' then NULL else o_ObjectGarTrailerNum end, case o_ObjectGOSTrailerNum when 'NULL' then NULL else o_ObjectGOSTrailerNum end, case o_ObjectOSAGOCode when 'NULL' then NULL else o_ObjectOSAGOCode end, case o_ObjectLicenCardNum when 'NULL' then NULL else o_ObjectLicenCardNum end, case o_ObjectLicenCardRegNum when 'NULL' then NULL else o_ObjectLicenCardRegNum end, case o_ObjectLicenCardSeria when 'NULL' then NULL else o_ObjectLicenCardSeria end, CASE o_ObjectLicenCardType WHEN 'NULL' THEN null ELSE cast (o_ObjectLicenCardType as int) END, case o_ObjectNumBody when 'NULL' then NULL else o_ObjectNumBody end,
IgnitionSensorID=CASE o_IgnitionSensorID WHEN 'NULL' THEN null ELSE cast (o_IgnitionSensorID as int)END,
--O_DynamicTracePointCnt, CASE O_DynamicTracePointCnt WHEN 'NULL' THEN null ELSE cast (O_DynamicTracePointCnt as int) END, --O_RefuelingThreshold, CASE O_RefuelingThreshold WHEN 'NULL' THEN null ELSE cast (O_RefuelingThreshold as int) END, 1 as ObjectActive from #object where d_code=@device_code
end else --if not exists объект begin print ('обновляем ТС'); Update FLEET_Object set MarkCarID=CASE o_MarkCarID WHEN 'NULL' THEN null ELSE cast (o_MarkCarID as int) END, ObjectGarNum=case o_ObjectGarNum when 'NULL' then NULL else o_ObjectGarNum end, ObjectGosNum=case o_ObjectGosNum when 'NULL' then NULL else o_ObjectGosNum end, ObjectType=case o_ObjectType when 'NULL' then NULL else o_ObjectType end, ObjectVIN=case o_ObjectVIN when 'NULL' then NULL else o_ObjectVIN end , ObjectNumMotor=case o_ObjectNumMotor when 'NULL' then NULL else o_ObjectNumMotor end, ObjectNumChass=case o_ObjectNumChass when 'NULL' then NULL else o_ObjectNumChass end, ObjectNumColum=CASE o_ObjectNumColum WHEN 'NULL' THEN null ELSE cast (o_ObjectNumColum as int) END, ObjectGarTrailerNum=case o_ObjectGarTrailerNum when 'NULL' then NULL else o_ObjectGarTrailerNum end, ObjectGOSTrailerNum=case o_ObjectGOSTrailerNum when 'NULL' then NULL else o_ObjectGOSTrailerNum end, ObjectOSAGOCode=case o_ObjectOSAGOCode when 'NULL' then NULL else o_ObjectOSAGOCode end, ObjectLicenCardNum=case o_ObjectLicenCardNum when 'NULL' then NULL else o_ObjectLicenCardNum end, ObjectLicenCardRegNum=case o_ObjectLicenCardRegNum when 'NULL' then NULL else o_ObjectLicenCardRegNum end, ObjectLicenCardSeria=case o_ObjectLicenCardSeria when 'NULL' then NULL else o_ObjectLicenCardSeria end, ObjectLicenCardType=CASE o_ObjectLicenCardType WHEN 'NULL' THEN null ELSE cast (o_ObjectLicenCardType as int) END, ObjectNumBody=case o_ObjectNumBody when 'NULL' then NULL else o_ObjectNumBody end,
IgnitionSensorID=CASE o_IgnitionSensorID WHEN 'NULL' THEN null ELSE cast (o_IgnitionSensorID as int)END, DynamicTracePointCnt=CASE o_DynamicTracePointCnt WHEN 'NULL' THEN null ELSE cast (o_DynamicTracePointCnt as int) END, RefuelingThreshold=CASE o_RefuelingThreshold WHEN 'NULL' THEN null ELSE cast (o_RefuelingThreshold as smallint) END from FLEET_Object inner join #object on d_code=@device_code where Device_ID=@device_id and ObjectActive=1 end -- esle if not exists объект
-- теперь самое не веселое, обновление списка сенсоров -- сначала update сенсеров print ('sensor update') update sys_dev_sensor set sensor_type_id=CASE s_sensor_type_id WHEN 'NULL' THEN null ELSE cast (s_sensor_type_id as smallint) END, IsAlarm=CASE s_IsAlarm WHEN 'NULL' THEN null ELSE cast (s_IsAlarm as tinyint) END, description=s_description, SaveAsEvent=CASE s_SaveAsEvent WHEN 'NULL' THEN null ELSE cast (s_SaveAsEvent as smallint) END, SensorActive=CASE s_SensorActive WHEN 'NULL' THEN null ELSE cast (s_SensorActive as smallint) END, HasOwnTank=s_HasOwnTank, MinValue=CASE s_MinValue WHEN 'NULL' THEN null ELSE cast (s_MinValue as float) END, MaxValue=CASE s_MaxValue WHEN 'NULL' THEN null ELSE cast (s_MaxValue as float) END, SensorClassificationId=CASE s_SensorClassificationId WHEN 'NULL' THEN null ELSE cast (s_SensorClassificationId as int) END, ObjectExtStatusID=CASE s_ObjectExtStatusID WHEN 'NULL' THEN null ELSE cast (s_ObjectExtStatusID as int) END, MapColor=CASE s_MapColor WHEN 'NULL' THEN null ELSE cast (s_MapColor as int) END, TableColor=CASE s_TableColor WHEN 'NULL' THEN null ELSE cast (s_TableColor as int) END, SignFontName=s_SignFontName, SignCharCode=CASE s_SignCharCode WHEN 'NULL' THEN null ELSE cast (s_SignCharCode as smallint) END from sys_dev_sensor inner join #sens on d_code=@device_code and s_num=num and sensor_type_id=s_sensor_type_id where device_id=@device_id
-- тех сенсеров которых нет мы вставим print ('sensor insert') insert into sys_dev_sensor (sensor_type_id, IsAlarm, description, SaveAsEvent, SensorActive, HasOwnTank, MinValue, MaxV alue, SensorClassifica tionId, ObjectExtStatusID, MapColor, TableColor, SignFontName, SignCharCode, num, device_id) select CASE s_sensor_type_id WHEN 'NULL' THEN null ELSE cast (s_sensor_type_id as smallint) END, CASE s_IsAlarm WHEN 'NULL' THEN null ELSE cast (s_IsAlarm as tinyint) END, s_description, CASE s_SaveAsEvent WHEN 'NULL' THEN null ELSE cast (s_SaveAsEvent as smallint) END, CASE s_SensorActive WHEN 'NULL' THEN null ELSE cast (s_SensorActive as smallint) END, s_HasOwnTank, CASE s_MinValue WHEN 'NULL' THEN null ELSE cast (s_MinValue as float) END, CASE s_MaxValue WHEN 'NULL' THEN null ELSE cast (s_MaxValue as float) END, CASE s_SensorClassificationId WHEN 'NULL' THEN null ELSE cast (s_SensorClassificationId as int) END, CASE s_ObjectExtStatusID WHEN 'NULL' THEN null ELSE cast (s_ObjectExtStatusID as int) END, CASE s_MapColor WHEN 'NULL' THEN null ELSE cast (s_MapColor as int) END, CASE s_TableColor WHEN 'NULL' THEN null ELSE cast (s_TableColor as int) END, s_SignFontName, CASE s_SignCharCode WHEN 'NULL' THEN null ELSE cast (s_SignCharCode as smallint) END, CASE s_num WHEN 'NULL' THEN null ELSE cast (s_num as int) END, @device_id
from #sens as t left join sys_dev_sensor as S on s.num=t.s_num and s.sensor_type_id=t.s_sensor_type_id and s.device_id=@device_id where t.d_code=@device_code and s.id is null;
-- теперь нужно работать с данными таррировки -- сначала проверим, что данных о таррировке нет по данному прибору print 'тарировка' if exists ( select AT.* from dbo.FLEET_AnalogTarirovka as AT inner join dbo.SYS_DEV_Sensor as S on S.Id=AT.IDSensor and S.SensorActive=1 inner join SYS_DEV_Device as D on D.id=S.device_id and d.DeviceActive=1 where D.code=@device_code ) begin -- а если данные есть - их удалим print 'данные таррировки будут удалены для прибора '+cast(@device_code as varchar(16)) delete FLEET_AnalogTarirovka from dbo.FLEET_AnalogTarirovka as AT inner join dbo.SYS_DEV_Sensor as S on S.Id=AT.IDSensor and S.SensorActive=1 inner join SYS_DEV_Device as D on D.id=S.device_id and d.DeviceActive=1 inner join #temp as t on t.d_code=d.code and t.s_num=s.num and t.at_idsensor!='NULL' where D.code=@device_code; end -- if exists тарировка print 'AnalogTarirovka insert' insert into FLEET_AnalogTarirovka (MinValue_Real, MaxValue_Real, MinValue_Tar, MaxValue_Tar, IDSensor) select cast(replace(t.AT_MinValue_Real,',','.') as float), cast(replace(t.AT_MaxValue_Real,',','.') as float), cast(replace(t.AT_MinValue_Tar,',','.') as float), cast(replace(t.AT_MaxValue_Tar,',','.') as float), S.ID from #temp as t inner join dbo.SYS_DEV_Sensor as S on s.num=t.s_num and s.sensor_type_id=t.s_sensor_type_id and S.SensorActive=1 inner join SYS_DEV_Device as D on D.id=S.device_id and d.DeviceActive=1 and d.id=@device_id where t.d_code=@device_code and t.AT_idSensor!='NULL'
FETCH NEXT FROM cur INTO @device_code end -- конец цикла по девайсам
drop table #temp -- удаление временной таблицы drop table #object -- удаление временной таблицы drop table #device drop table #sens --IF @@ERROR <> 0 ROLLBACK TRANSACTION --else commit tran t1 ;-- фиксации транзакции
-- ну и под конец, что бы данные появились у клиента на экране - их тоже обновим print 'Обновление currentdata' 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 and o.objectactive=1 left join sys_dev_currentdata as cd on cd.device_id=d.id where d.deviceactive=1 and cd.id is null где FROM 'd:\55.csv' -- из файла, сформированного данным скриптом. Файл должен быть доступен для чтения серверу SQL!!!
|
|
| |