Проблема XML-запроса / изменения в SQL Server 2008 r2 - PullRequest
4 голосов
/ 11 июля 2011

Я довольно новичок в SQL, и я пытаюсь отфильтровать и изменить значения внутри столбца, в котором содержится документ XML для покупного заказа.Вот пример того, как выглядит XML-документ и что я ищу.

 <TenderLines>
   <TenderLineItem>
     <tenderTypeId>S0001-00000001</tenderTypeId>
     ..
     ..
    </TenderLineItem>
  <TenderLines>

У меня более 6000 строк, и не все из них имеют одинаковый tenderTypeId.Я хочу отфильтровать значения в tenderTypeId, имеющие 'S0001-00000001', и изменить их на '2'

Пока что это то, что я придумал.

USE LSPOS80
DECLARE @replacement as varchar(50)
DECLARE @redundant as varchar(50)
SET @replacement = '2'
SET @redundant = 'S0001-00000001'

Update dbo.POSISTRANSACTIONTABLE
SET TRANSACTIONXML.modify
('replace value of(/RetailTransaction/TenderLines/TenderLineItem/tenderTypeId/@redundant) [1] with sql:variable("@replacement")')

Запрос выполнен успешно, но ничего не меняется, и мне было интересно, если кто-нибудь из вас сможет прочитать это и, возможно, дать мне советы.

Спасибо за ваше время, с наилучшими пожеланиями, Вальди.

PSЯ использую Microsoft SQL Server 2008 R2 - Express Edition

1 Ответ

3 голосов
/ 11 июля 2011
update dbo.POSISTRANSACTIONTABLE set
  TRANSACTIONXML.modify('replace value of (/TenderLines/TenderLineItem/tenderTypeId/text())[1] with (sql:variable("@replacement"))')
where XMLCol.exist('/TenderLines/TenderLineItem/tenderTypeId[. = sql:variable("@redundant")]') = 1

Что проверять:

declare @T table(XMLCol xml)
insert into @T values 
('<TenderLines>
   <TenderLineItem>
     <tenderTypeId>S0001-00000001</tenderTypeId>
    </TenderLineItem>
 </TenderLines>'),
('<TenderLines>
   <TenderLineItem>
     <tenderTypeId>S0003-00000003</tenderTypeId>
    </TenderLineItem>
 </TenderLines>')

DECLARE @replacement as varchar(50)
DECLARE @redundant as varchar(50)
SET @replacement = '2'
SET @redundant = 'S0001-00000001'

update @T set
  XMLCol.modify('replace value of (/TenderLines/TenderLineItem/tenderTypeId/text())[1] with (sql:variable("@replacement"))')
where XMLCol.exist('/TenderLines/TenderLineItem/tenderTypeId[. = sql:variable("@redundant")]') = 1

select *
from @T

Обратите внимание, что это заменит только одно значение tenderTypeId в XML для каждой строки. Если у вас есть несколько tenderTypeId в xml (в одной строке), и вы хотите заменить их все, вам нужно поместить оператор обновления в цикл while и заменить до тех пор, пока where XMLCol.exist('/TenderLines/TenderLineItem/tenderTypeId[. = sql:variable("@redundant")]') = 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...