2014-01-28 6 views
2

Я новичок в XML с SQL. Как указать индекс в инструкции insert, как показано ниже. Следующий оператор выдает исключение с недопустимым путем для обновления.Как динамически изменить значение индекса с помощью SQL DML

set @xmldata.modify('insert <Test>Test1</Test> after (/xyz/abc)[sql:variable("@index")]') 

sql:variable() Function (XQuery) есть несколько примеров, но это не говорит об изменении индекса, но другую часть заявления.

+1

Пожалуйста, пост фактический код, таблицы и некоторые выборочные данные. Это поможет ... –

ответ

1

Вы проверили эту статью. http://technet.microsoft.com/en-us/library/ms175466.aspx

SELECT @myDoc  
set @myDoc.modify('  
insert <BikeFrame>Strong long lasting</BikeFrame> 
after (/Root/ProductDescription/Features/Material)[1]  
')  
SELECT @myDoc; 

Это предполагает, что существует тег Material. Является ли путь (/ xyz/abc) действительным?

<Root> 
    <ProductDescription ProductID="1" ProductName="Road Bike"> 
    <Features> 
     <Warranty>1 year parts and labor</Warranty> 
     <Maintenance>3 year parts and labor extended maintenance is available</Maintenance> 
     <Material>Aluminium</Material> 
     <BikeFrame>Strong long lasting</BikeFrame> 
    </Features> 
    </ProductDescription> 
</Root> 

Кроме того, проверьте текущий код с литералью вместо переменной sql:.

Снова, пожалуйста, отправьте xml/code.

Благодаря

Джон

+0

Эй, Джон, Большое спасибо за ваш ответ. Я проверил код без переменной sql:, ​​которая работает нормально. Давайте рассмотрим пример, который вы положили. '(/ Root/ProductDescription/Features/Material) [1]' как заменить '[1]' на это? – sarat

1

Выражения2 в insert (XML DML) должен возвращать один узел. Проверка выполняется, когда запрос разобран в первый раз, и SQL Server затем не может оценить предикат, который вы используете, чтобы выяснить, будет ли выражение всегда возвращать один узел. Но если вы укажете буквальное значение в скобках, SQL Server знает, что будет возвращена только одна строка.

Для решения проблемы вам необходимо добавить [1] в конец вашего выражения.

set @xmldata.modify('insert <Test>Test1</Test> 
        after (/xyz/abc[sql:variable("@index")])[1]') 

Это даст вам узел вы хотите

/xyz/abc[sql:variable("@index")] 

и это будет сказать, что SQL Server выражение гарантированно возвращает один узел.

(/xyz/abc[sql:variable("@index")])[1] 

SQL Fiddle

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

  • Нет связанных вопросов^_^