我在SQL Server中有一个包含SQL where子句的XML列。 我想用查询结果替换特定的子字符串。 在下面的示例中,我想用EconPeriod ='2011年1月'替换p。[EconPeriodID] = 4并用Book ='Canada'替换p。[BookID] = 2
<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 shred,以便与Replace一起使用。
答案 0 :(得分: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