我正在使用 SQL Server 2012
我有一个长时间运行的扩展事件(运行数天以捕获事件)保存到 .xel 文件。
我有一项定期运行以将数据导入临时表的工作。我只是event_data
从文件中导入 XML 列,因此我可以解析出我需要的 XML 字段并保存到表中以进行报告。
我知道我上次运行导入的时间是什么时候,所以我想看看我是否只能从文件中选择自上次运行导入过程以来添加的记录。
我现在可以使用它,但是它将文件中的所有记录导入临时表,解析出我需要的字段(包括时间戳),然后仅导入自上次运行作业以来具有时间戳的记录。
自上次作业运行以来,我的流程仅插入新的,因此一切正常,但它为文件中的所有记录导入和解析 XML 做了很多工作,包括我上次运行作业时已经导入的那些.
所以我想找到一种方法,如果文件已经导入,则根本不从文件中导入,或者至少不必为已导入的记录解析 XML(尽管我现在必须解析它以获取时间戳排除已经处理的)。
下面是我所拥有的,正如我所说,它可以工作,但是如果我能找到一种方法来跳过我已经导入的那些,它会做很多额外的工作。
我只包括了我需要帮助的流程步骤:
-- pull data from file path and insert into staging table
INSERT INTO #CaptureObjectUsageFileData (event_data)
SELECT cast(event_data as XML) as event_data
FROM sys.fn_xe_file_target_read_file(@FilePathNameToImport, null, null, null)
-- parse out the data needed (only columns using) and insert into temp table for parsed data
INSERT INTO #CaptureObjectUsageEventData (EventTime, EventObjectType, EventObjectName)
SELECT n.value('(@timestamp)[1]', 'datetime') AS [utc_timestamp],
n.value('(data[@name="object_type"]/text)[1]', 'varchar(500)') AS ObjectType,
n.value('(data[@name="object_name"]/value)[1]', 'varchar(500)') as ObjectName
from (
SELECT event_data
FROM #CaptureObjectUsageFileData (NOLOCK)
) ed
CROSS apply ed.event_data.nodes('event') as q(n)
-- select from temp table as another step for speed/conversion
-- converting the timestamp to smalldatetime so it doesnt get miliseconds so when we select distinct it wont have lots of dupes
INSERT INTO DBALocal.dbo.DBObjectUsageTracking(DatabaseID, ObjectType, ObjectName, ObjectUsageDateTime)
SELECT DISTINCT @DBID, EventObjectType, EventObjectName, CAST(EventTime AS SMALLDATETIME)
FROM #CaptureObjectUsageEventData
WHERE EventTime > @LastRunDateTime