如何用SQL Server中的查询结果替换XML子字符串?

问题描述:

我在SQL Server中有一个包含SQL where子句的XML列。 我想用查询结果替换特定的子字符串。 在下面的例子中,我想替换页。[EconPeriodID] = 4 EconPeriod = '2011年1月' 和替换页。[的BookID] = 2与预订= '加拿大'如何用SQL Server中的查询结果替换XML子字符串?

<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 

更新: 我使用跨应用和更改保存的查询使用人类可读的PARAMS之争。 Cross Apply允许我在查询中多次引用XML Shred,以便与Replace一起使用。

+0

如果要更新SQL-Server中的XML实例,则必须使用某些没有SQL标准功能或使用供应商特定的XML DML语言。 SQL-Server不支持XQuery更新工具,既不完全支持XQuery。 – 2011-03-22 02:59:30

所以你要返回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中的id和表。 例如:从econperiod中选择姓名,其中id = 4 或者它可以是选择书籍中的姓名,其中id = 21 – 2011-04-12 13:26:36

+0

因此,如果您将REPLACE语句视为REPLACE(A,B,C)知道B或C直到运行时?它们可能因记录而异? – 2011-04-13 15:29:11