2014-10-01 3 views
1

После установки значения @ temp1 мне сказали, что я могу оптимизировать эти запросы в инструкции SELECT, получая 2 значения вместо того, чтобы иметь «повторный доступ к XML».Оптимизировать SQL-запрос, который запрашивает один и тот же XML несколько раз

DECLARE @temp1 XML 
DECLARE @exec_gadget_config XML 
DECLARE @exec_client_name_index NVARCHAR(500) 
DECLARE @exec_client_number_index NVARCHAR(500) 

SELECT @temp1 = '<gadget name="EYDocuments">     
        <drawer id="0000000002"> 
         <otherColumns> 
          <col id="000000000B" name="Client Name" /> 
          <col id="000000000C" name="Client Number" /> 
         </otherColumns> 
        </drawer> 
       </gadget>' 

SELECT @exec_client_number_index = (
     SELECT @temp1.value('(//drawer[@id="0000000002"]/otherColumns//col[@name="Client Name"]/@id)[1]', 'NVARCHAR(500)') 
     ) 

SELECT @exec_client_name_index = (
     SELECT @temp1.value('(//drawer[@id="0000000002"]/otherColumns//col[@name="Client Number"]/@id)[1]', 'NVARCHAR(500)') 
     ) 

SELECT @exec_client_number_index, @exec_client_name_index 
  1. Возможно ли это?
  2. Предлагаемый ответ на этот вопрос приведен ниже. Удаляет ли это «повторный доступ к XML»?
  3. Если нет, то как я могу это сделать?

пространство

SELECT @exec_client_number_index = (
     SELECT @temp1.value('(//drawer[@id="0000000002"]/otherColumns//col[@name="Client Name"]/@id)[1]', 'NVARCHAR(500)') 
     ), @exec_client_name_index = (
     SELECT @temp1.value('(//drawer[@id="0000000002"]/otherColumns//col[@name="Client Number"]/@id)[1]', 'NVARCHAR(500)') 
     ); 
+0

вы используете суб-выбирает, так что вы все еще делаете «повторный доступ к XML ". каждый из этих подзапросов будет разобран/выполнен отдельно. –

+0

Есть ли способ сделать это без «повторного доступа к XML»? – Hoppe

+0

@ Хоппе: Проверьте мой ответ ... –

ответ

1

Попробуйте это -

DECLARE @temp1 XML 
SELECT @temp1 = '<gadget name="EYDocuments">     
          <drawer id="0000000002"> 
           <otherColumns> 
            <col id="000000000B" name="Client Name" /> 
            <col id="000000000C" name="Client Number" /> 
           </otherColumns> 
          </drawer> 
         </gadget>' 

SELECT 
    a.b.value('@id', 'varchar(10)') value 
FROM 
    @temp1.nodes('/gadget/drawer/otherColumns/col') a(b) 

Выход

value 
---------- 
000000000B 
000000000C 
+0

«a» выглядит как псевдоним стола. Если да, то что (б)? – Hoppe

+1

@ Хоппе: Фактически синтаксис ** узлов ** - это «узлы (XQuery) как таблица (столбец)», это означает, что «a (b)» - это имя таблицы и имя столбца для результирующего набора строк. –

+0

Я добавил инструкцию по порядку, чтобы определить, что есть. Благодаря! ВЫБОР \t abvalue ('@ Id', 'VARCHAR (10)') attr_id, \t abvalue ('@ имя', 'VARCHAR (20)') attr_name ОТ \t @ temp1.nodes ('/ гаджета/drawer/otherColumns/col ') a (b) ORDER BY attr_name – Hoppe

Смежные вопросы