我有一个包含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])' )
,表达式将被正确评估。
但我怎样才能使上述工作成功?
答案 0 :(得分: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
我知道没有其他方法可以在SQL Server中为查询提供XPath表达式。
您可以尝试直接添加表达式:
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
。