Он работает с обоими:
WITH q AS
(
SELECT CAST('<root><node>1</node></root>' AS XML) AS doc
)
SELECT doc.value('(/root/node)[1]', 'INT'),
doc.value(N'(/root/node)[1]', 'INT')
FROM q
Обратите внимание, что XQuery
составляется на этапе синтаксического анализа, т.е.. е. вы можете предоставить только строковый литерал как первый аргумент (не столбец, выражение или переменная).
Этот строковый литерал не имеет «типа», так как тип принимает набор возможных значений, которые известны только во время выполнения, а функции XML
принимают только литералы XQuery
выражения, которые должны быть известны во время компиляции.
Вы не можете передавать их из аргументов или своих функций или в виде переменных, их можно запрограммировать только в запросе.
Рассматривайте их как зарезервированные слова (например, SELECT
или UPDATE
), которые по какой-то причине должны быть заключены в одинарные кавычки.
Вы должны построить весь запрос динамически, если вы хотите, чтобы XQuery
был динамическим.
Я очень шокирован тем, что не могу передать значение XQuery в качестве параметра, но только как «строковый литерал» ... – Sung
@Sung Meister: они не ожидают «типа», они ожидают, что набор зарезервированных слов будет закрыт в одинарные кавычки, необязательно с надписью «N». Не обманывайтесь тем, что это выглядит как «VARCHAR» или «NVARCHAR»: это ни один из них. – Quassnoi
Похоже, что BOL довольно вводит в заблуждение в описании параметра XQuery - «Является строкой, выражением XQuery ...». Они ничего не упоминают о методах XML Data, ожидающих «набор зарезервированных слов, заключенных в одинарные кавычки» – Sung