2011-03-21 62 views
0

我在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

回答

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中的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

相關問題