Оценка выражений XQuery/XPath от стола

У меня есть стол, который содержит выражения XQuery. Я хотел бы оценить выражение от каждого ряда для данной структуры данных XML. Я пробую это.

DECLARE @somexml xml
SET @somexml = 'truefalse'

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

The Expression column contains values of type NVARCHAR(MAX) such as: - xs:boolean(/root[1]/nodeA[1])

Выполняя этот , ИЗБРАННЫЙ , выражения не становятся оцененными, вместо этого само выражение возвращено (btw типа XML)

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

Если заменять @somexml.query ('sql:column ("AF. Выражение")') с фактическим выражением @somexml.query ('xs:boolean (/корень [1]/nodeA[1])') выражение правильно оценено.

Но как я могу заставить вышеупомянутое работать?

1
добавлено отредактировано
Просмотры: 2
nl ja de
Вы могли использовать новое, инструкция XSLT 3.0 (не XQuery). См.: w3.org/TR/xslt-30/#element-evaluate
добавлено автор Dimitre Novatchev, источник
Мое плохое, забыл последний признак
добавлено автор Szymon Seliga, источник

1 ответы

Необходимо построить вопрос динамично что-то вроде этого:

DECLARE @somexml XML
SET @somexml = 'truefalse'

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 as suggested by Dimitre Novatchev is not supported in SQL Server.

2
добавлено
@Szymonides, который я обновил с немного большим количеством информации о том, что можно было бы попробовать. , Почему это похоже на это, я могу только размышлять. Используемое выражение XPath интерпретируется, когда план запросов создается так, стоимость должна быть известна, прежде чем будет пора на самом деле выполнить вопрос.
добавлено автор Mikael Eriksson, источник
@Szymonides Да, который был бы проблемой, строя вопрос динамично. Не невозможный (в зависимости от того, что вы хотите сделать), но более сложный.
добавлено автор Mikael Eriksson, источник
Ну, на самом деле я хотел избежать Динамического SQL. Нет ли никакой другой путь. В противном случае, почему так? Я can' t действительно думают о причине.
добавлено автор Szymon Seliga, источник
<�кодовый> AerialFees содержит больше чем один ряд, но @SQL содержит только последний вход.
добавлено автор Szymon Seliga, источник