2012-01-09 3 views
4
DECLARE @myXml XML 

SET @myXml = CONVERT(xml, '<a key="2"></a>', 1) 

SELECT s.value('@key', 'VARCHAR(8000)') AS myKey from @myXml.nodes('/a') t(s) 

Ответ:SQL Server XQuery в одной строке?

enter image description here

это хорошо.

Я хочу сделать это без объявления переменной @myXml.

Что-то вроде:

SELECT 
    s.value('@key', 'VARCHAR(8000)') AS myKey 
FROM 
    CONVERT(xml, N'<a key="2"></a>', 1) .nodes('/a') t(s) 

, но я получаю сообщение об ошибке:

enter image description here

ответ

2

Вы можете сделать:

Select CONVERT(xml, N'<a key="2"></a>', 1).value('a[1]/@key', 'varchar(8000)') 
+0

Почему [1] ???? –

+0

@Royi Namir: Это ограничивает вас одним экземпляром тега 'a' под корнем. Если вам требуется более одного экземпляра (если ваша реальная строка XML более сложна, чем та, что в вашем примере), вам понадобится другой подход, который фактически уничтожает XML, как ваш первый образец (и мой, ниже, делает). Если есть _is_ только один тег 'a', подход kd7, безусловно, будет быстрее. – mwigdahl

1

Это должно работать:

;WITH xgen (xdata) 
AS 
(
    SELECT CONVERT(xml, '<a key="2"></a>', 1) AS xdata 
) 
select s.value('@key', 'VARCHAR(8000)') AS myKey 
from xgen 
    cross apply xgen.xdata.nodes('/a') t(s) 
Смежные вопросы