gpt4 book ai didi

SQL 使用 sys.fn_xe_file_target_read_file 导入扩展事件文件如何仅获取自上次导入以来的值

转载 作者:行者123 更新时间:2023-12-04 15:49:39 37 4
gpt4 key购买 nike

我正在使用 SQL Server 2012

我有一个长时间运行的扩展事件(运行数天以捕获事件)保存到 .xel 文件。

我有一个定期运行的作业,用于将数据导入暂存表。 我只是从文件中导入 XML event_data 列,这样我就可以解析出我需要的 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

最佳答案

好的,我已经发表了评论,但是 - 在更深入地思考并查看您的代码之后 - 这可能相当简单:

您可以存储上次导入的时间并在 .nodes() 中使用谓词 (就像您在 .value() 中执行此操作以获得正确的 <data> - 元素一样)。

尝试这样的事情:

DECLARE @LastImport DATETIME=GETDATE(); --put the last import's time here

and then

CROSS apply ed.event_data.nodes('event[@timestamp cast as xs:dateTime? > sql:variable("@LastImport")]') as q(n)

这样做,.nodes()应该只返回 <event> - 条件满足的元素。如果这没有帮助,请展示一些简化的 XML 示例以及您想要获得的内容。

关于SQL 使用 sys.fn_xe_file_target_read_file 导入扩展事件文件如何仅获取自上次导入以来的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54370316/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com