1

我有一个包含 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])' ),则表达式得到正确评估。

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

4

1 回答 1

2

您需要动态构建查询,如下所示:

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(如您所做的那样),但这只是返回列中的值。它不会尝试评估表达式。

xsl:evaluate正如Dimitre Novatchev所建议的, SQL Server不支持。

于 2013-01-09T13:33:05.203 回答