2011-03-21 5 views
0

У меня есть столбец XML в SQL Server, содержащий предложение SQL where. Я хотел бы заменить определенные подстроки на результаты запроса. В приведенном ниже примере я хочу заменить р. [EconPeriodID] = 4 с EconPeriod = 'Jan 2011' и заменить р. [BookID] = 2 с Book = 'Canada'Как заменить подстроку XML на результаты запроса в SQL Server?

<Parameter Name="whereClause" 
      BaseType="nvarchar" 
      Precision="0" 
      Scale="0" 
      MaxLength="64" 
      >WHERE (p.[EconomicPeriodID] = 4 and p.[BookID] = 2)</Parameter> 

Я не использую поиск CrossApply, потому что я возвращаю несколько сообщений с разными параметрами.

Полного запрос ниже:

DECLARE @sdt_Date DATETIME 
SET @sdt_Date = '3/17/2011' 

SELECT name , 
     submit_time , 
     request, 
     CONVERT(VARCHAR, request.value(N' 
    (for $A in /ServiceProxy/Event/Parameters/Parameter 
    where $A/@Name ="valuationDate" 
    return $A/text())[1] 
', 'datetime'), 111) 
    AS 'EOD Date' , 
     request.query(N' 
    for $A in /ServiceProxy/Event/Parameters/Parameter 
    where $A/@Name ="whereClause" 
    return $A/text() 
').value('.', 'varchar(max)') AS 'WHERE Clause' 
FROM Requests 
WHERE submit_time BETWEEN DATEADD(dd, 0, 
                 DATEDIFF(dd, 0, 
                   @sdt_Date)) 
             AND  DATEADD(dd, 1, 
                 DATEDIFF(dd, 0, 
                   @sdt_Date)) 
ORDER BY submit_time DESC 

Update: Я обсуждаю между использованием Cross Применить и изменение сохраненного запроса использовать считываемые Params человека. Cross Apply позволит мне ссылаться на XML-фрагмент несколько раз в запросе, для использования с Replace.

+0

Если вы хотите обновить экземпляр XML в SQL-Server, вы должны использовать некоторую стандартную функцию SQL или использовать специфический для поставщика язык XML DML. SQL-Server не поддерживает средство обновления XQuery, не полностью поддерживает XQuery. –

ответ

0

Итак, вы возвращаете предложение WHERE как строку? Вы не пытаетесь обновить значение в столбце XML, просто вернув измененное значение?

Не могли бы вы сделать что-нибудь подобное?

WITH A AS 
( your query minus the ORDER BY clause) 
SELECT Name 
    , submit_time 
    , request 
    , [EOD Date] 
    , [WHERE Clause] = REPLACE(A.[WHERE Clause], 'p.[EconPeriod] = 4','[EconPeriod] = ''Jan 2011''') 
FROM A 
ORDER BY submit_time DESC 
+0

Ann: Модифицированное значение, которое я хочу вернуть, является результатом другого запроса, основанного на идентификаторах и таблицах в XML. Например: выберите имя из econperiod, где id = 4 , или его можно выбрать из книги, где id = 21 –

+0

Итак, если вы считаете, что оператор REPLACE имеет форму REPLACE (A, B, C), вы выиграли ' t знать B или C до времени выполнения? И они могут варьироваться в зависимости от записи? –

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