SQL Server XQuery语法错误

时间:2018-03-02 07:35:31

标签: sql sql-server tsql xquery serilog

我正在使用Serilog Sinks for SQLServer,并使用this链接遵循数据库架构和XQuery语法。但是,当我在Navicat中运行以下查询时,我收到错误。

以下是查询:

SELECT 
Properties.value('(/properties/property[@key="contact"]/structure[@type="Contact"]/property[@key="ContactId"])[1]', 'nvarchar(max)') AS ContactId,
Properties.value('(/properties/property[@key="contact"]/structure[@type="Contact"]/property[@key="FirstName"])[1]', 'nvarchar(50)') AS FirstName,
Properties.value('(/properties/property[@key="contact"]/structure[@type="Contact"]/property[@key="Surname"])[1]', 'nvarchar(100)') AS Surname,
Properties.value('(/properties/property[@key="cacheKey"])[1]', 'nvarchar(100)') AS CacheKey,
*
FROM Log
WHERE MessageTemplate = 'Contact {@contact} added to cache with key {@cacheKey}'
    AND Properties.value('(/properties/property[@key="contact"]/structure[@type="Contact"]/property[@key="ContactId"])[1]', 'nvarchar(max)') = 'f7d10f53-4c11-44f4-8dce-d0e0e22cb6ab' 

以下是错误陈述:

  

[Err] 42000 - [SQL Server]无法找到列“属性”或用户定义的函数或聚合“Properties.value”,或者名称不明确。

任何解决方案或解决方法都将受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

如果Log表具有Properties列且其格式为XML,则运行您的查询。

因此,您必须更改列的类型或将其作为XML投射到查询中。

第二种方法看起来像cast(Properties as xml).value ...