【问题标题】:How can I replace an XML substring with the results of a query in SQL Server?如何用 SQL Server 中的查询结果替换 XML 子字符串?
【发布时间】:2011-03-21 15:09:15
【问题描述】:

我在 SQL Server 中有一个 XML 列,其中包含一个 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 可以让我在查询中多次引用 XML 碎片,以便与 Replace 一起使用。

【问题讨论】:

  • 如果要更新 SQL-Server 中的 XML 实例,则必须使用一些非 SQL 标准函数或使用供应商特定的 XML DML 语言。 SQL-Server 不支持 XQuery 更新工具,也不完全支持 XQuery。

标签: sql-server sql-server-2005 sql-server-2008 xml-dml


【解决方案1】:

所以您将 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

【讨论】:

  • 安:我要返回的修改值是另一个查询的结果,基于 XML 中的 id 和表。例如:从 id = 4 的 econperiod 中选择名称,或者从 id = 21 的书中选择名称
  • 那么,如果您认为 REPLACE 语句具有 REPLACE(A, B, C) 形式,那么直到运行时您才会知道 B 或 C?它们可能因记录而异?
猜你喜欢
  • 2012-09-28
  • 2015-02-27
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多