среда, 22 мая 2013 г.

Один из множества вариантов выгрузки данных из Historian

      Часто возникает необходимость выгружать данные для каких либо внешних систем ... впринципе есть много разных способов это сделать ...
      Ниже я приведу SQL запрос кторый читает список тегов из одной таблицы и по этому списку читает среднее за пол часа из Historian. Чтение сделано курсором .. не самый эфективный вариант с точки зрения производительности но если нужно выгружать не много и не часто то пойдет. А если нет то можно оптимизировать, но это уже отдельный вопрос :)

если кому тема интересна но непонятна ... пишите, прокоментирую :)


SET NOCOUNT ON

DECLARE @StartDate DateTime;
DECLARE @EndDate DateTime;

SET @StartDate =  convert(nvarchar,  (SELECT ISNULL(Max([DateTime]),DateAdd(HH,-24,GetDate())) FROM testExportDB.dbo.data ), 21);


SET @EndDate = GetDate()
SET NOCOUNT OFF
select @StartDate,@EndDate
DECLARE @TagName nvarchar(256);


DECLARE tags_cursor CURSOR LOCAL FOR 
SELECT     TagName
FROM         testExportDB.dbo.Tags
WHERE     (ScheduleNumber = 1);

OPEN tags_cursor
FETCH NEXT FROM tags_cursor INTO @TagName; 
WHILE @@FETCH_STATUS = 0
BEGIN

--INSERT INTO testExportDB.dbo.data

SELECT temp.TagName ,Description ,DateTime  ,Value ,Unit = ISNULL(Cast(EngineeringUnit.Unit as VarChar(20)),'N/A')  ,QualityString  From (
SELECT  * 
 FROM Runtime.dbo.History
 WHERE History.TagName IN (@TagName)
 AND wwRetrievalMode = 'Average'
 AND wwResolution = 1800000
 AND wwVersion = 'Latest'
 AND DateTime >= @StartDate
 AND DateTime <= @EndDate) temp
LEFT JOIN Runtime.dbo.Tag ON Tag.TagName =temp.TagName
LEFT JOIN Runtime.dbo.AnalogTag ON AnalogTag.TagName =temp.TagName
LEFT JOIN Runtime.dbo.EngineeringUnit ON AnalogTag.EUKey = EngineeringUnit.EUKey
LEFT JOIN Runtime.dbo.QualityMap ON QualityMap.QualityDetail = temp.QualityDetail
 WHERE temp.StartDateTime >= @StartDate


FETCH NEXT FROM tags_cursor INTO @TagName
END

CLOSE tags_cursor
DEALLOCATE tags_cursor

а вот этот запрос выгружает таблицу в CSV файл


DECLARE @FileCSV VARCHAR(100),
@Query VARCHAR(256),
@FileNameDT DateTime;
SET @FileNameDT = DateAdd(HH,-24,GetDate());

SET @FileCSV = 'c:\tmp\data' + convert(nvarchar, @FileNameDT, 112)  + '-0000.csv'
SET @Query = 'SQLCMD -S . -d testExportDB -Q "SELECT * FROM testExportDB.dbo.data" -s "," -o ' + @FileCSV

EXEC xp_cmdshell @Query


а этот (прямо из мсдн скопировал)разрешает работу предидущего


-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1
GO
-- To update the currently configured value for this feature.
RECONFIGURE
GO