Как заменить подстроку XML результатами запроса в SQL Server? - PullRequest
0 голосов
/ 21 марта 2011

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

<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

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

1 Ответ

0 голосов
/ 07 апреля 2011

Итак, вы возвращаете предложение 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
...