Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MSSQL XML max函数返回null_Sql_Xml_Xpath_Sql Server 2008 R2_Sqlxml - Fatal编程技术网

MSSQL XML max函数返回null

MSSQL XML max函数返回null,sql,xml,xpath,sql-server-2008-r2,sqlxml,Sql,Xml,Xpath,Sql Server 2008 R2,Sqlxml,在我的事务表中,我有一个XML列,其中包含有关事务的一些附加信息,例如,如何计算事务中的某些价格(对于发布方和卖方)。由于计算算法可能会更改,因此可以多次计算事务。完整的计算历史记录保存在XML中 现在我想知道最近计算的算法的修订号。XML结构如下所示: 布拉 布拉 布拉 布拉 布拉 布拉 布拉 布拉 布拉 布拉 布拉 所以我试着选择最新的修订号作为一列,如下所示: 选择XmlColumn.value('(/DataItems/CalculationHistory/Seller[@Time=

在我的事务表中,我有一个XML列,其中包含有关事务的一些附加信息,例如,如何计算事务中的某些价格(对于发布方和卖方)。由于计算算法可能会更改,因此可以多次计算事务。完整的计算历史记录保存在XML中

现在我想知道最近计算的算法的修订号。XML结构如下所示:


布拉
布拉
布拉
布拉
布拉
布拉
布拉
布拉
布拉
布拉
布拉
所以我试着选择最新的修订号作为一列,如下所示:

选择XmlColumn.value('(/DataItems/CalculationHistory/Seller[@Time=max(/DataItems/CalculationHistory/Seller/@Time)]/@Revision)[1],“int”)作为SellerRevision FROM Transactions
但每次都返回
null
。我发现问题在于
max()
函数返回
null
,即使在这种情况下:

从事务中选择XmlColumn.query('max(/DataItems/CalculationHistory/Seller/@Time)')
…虽然将
max
替换为
data
会返回正确的时间戳


所以我想我没有正确使用
max
函数,但我做错了什么?

奇怪的是,
max
对字符串属性/元素不起作用:

select (select cast('<A D="1"/>' as xml)).query('max(/A/@D)')
-- returns 1

select (select cast('<A D="a"/>' as xml)).query('max(/A/@D)')
-- returns nothing


稍后我将尝试检查是否可以在SQL Server xpath中使用max on字符串

您的解决方法确实有效,但它(不可避免)非常复杂,特别是因为我必须在.NET实体框架的一个语句中使用其中两个查询。当然,你的答案解决了这个问题——尽管我使用了另一种变通方法,重新构造了C#代码以允许更简单的查询。(现在,我检查是否存在具有特定
修订版
属性值的XML节点。)
declare @Time nvarchar(max)

select @Time = max(T.C.value('@Time', 'nvarchar(max)'))
from @Data.nodes('DataItems/CalculationHistory/Seller') as T(C)

select @Data.value('(/DataItems/CalculationHistory/Seller[@Time=sql:variable("@Time")]/@Revision)[1]', 'int')