【问题标题】:Evaluating XQuery/XPath expressions from table从表中评估 XQuery/XPath 表达式
【发布时间】:2013-01-09 11:37:18
【问题描述】:

我有一个包含 XQuery 表达式的表。我想为给定的 XML 数据结构评估每一行的表达式。我正在尝试这个。

DECLARE @somexml xml
SET @somexml = '<root><nodeA>true</nodeA><nodeB>false</nodeB></root>'

SELECT
    @somexml.query('sql:column("af.Expression")' ) AS Fee,
    [af].Expression 
FROM 
    [AerialFees] af

Expression 列包含 NVARCHAR(MAX) 类型的值,例如: - xs:boolean(/root[1]/nodeA[1])

执行此SELECT 时,表达式不会被计算,而是返回表达式本身(顺便说一句,XML 类型)

Fee                        Expression
==================================================
xs:boolean(/root[1]/nodeA[1])    xs:boolean(/root[1]/nodeA[1])

如果将 @somexml.query('sql:column("af.Expression")' ) 替换为实际表达式 @somexml.query('xs:boolean(/root[1]/nodeA[1])' ),则表达式得到正确计算。

但我怎样才能使上述工作?

【问题讨论】:

标签: sql sql-server xml xpath xquery


【解决方案1】:

您需要像这样动态构建查询:

DECLARE @somexml XML
SET @somexml = '<root><nodeA>true</nodeA><nodeB>false</nodeB></root>'

DECLARE @Fees Table
(
    RowNum int,
    Expression nvarchar(max)
)   

INSERT INTO @Fees
SELECT 
    RowNum = ROW_NUMBER() OVER(ORDER BY af.idAerialFee),
    [af].Expression 
FROM 
    [AerialFee] af 

DECLARE @MaxRownum INT
SET @MaxRownum = (SELECT MAX(RowNum) FROM @Fees)

DECLARE @Iter INT
SET @Iter = (SELECT MIN(RowNum) FROM @Fees)

DECLARE @SQL NVARCHAR(MAX)

WHILE @Iter <= @MaxRownum
BEGIN
    -- Get XQuery
    SELECT @SQL = 'SELECT @somexml.query(''' + af.Expression + ''') AS Fee'
    FROM @Fees af
    WHERE RowNum = @Iter

    -- Evaluate XQuery
    EXEC sp_executesql @SQL, N'@somexml xml', @somexml

    -- Get next rows number
    SET @Iter = @Iter + 1
END

我知道没有其他方法可以将 XPath 表达式提供给 SQL Server 中的查询。

您可以尝试直接添加表达式:

select @somexml.query(af.Expression)
from AerialFees as af

但这会给你错误信息

Msg 8172, Level 16, State 1, Line 27
The argument 1 of the XML data type method "query" must be a string literal.

或者您可以尝试使用sql:column(就像您所做的那样),但这只会返回列中的值。它不会尝试评估表达式。

Dimitre Novatchev 建议的xsl:evaluate 在SQL Server 中不受支持。

【讨论】:

  • 好吧,实际上我想避免使用动态 SQL。有没有别的办法。如果不是,为什么会这样?我实在想不出理由。
  • @Szymonides 我更新了更多关于可以尝试什么的信息。 为什么是这样的,我只能推测。使用的 XPath 表达式在创建查询计划时进行解释,因此在实际执行查询之前必须知道该值。
  • AerialFees 包含不止一行,但@SQL 仅包含最后一个条目。
  • @Szymonides 是的,这在动态构建查询时会出现问题。不是不可能(取决于你想做什么)但更复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
相关资源
最近更新 更多