Sql server 修改语法

Sql server 修改语法,sql-server,xml,Sql Server,Xml,我试图找出XML更新查询的错误。我没有太多在SQL中使用XML的经验,但我认为这应该行得通 我想更新XML中路径值的一个值 以下是我目前正在尝试的: DECLARE @PATH VARCHAR(500) = 'TEST' IF OBJECT_ID('tempdb..#SUBSCRIPTION', 'U') IS NOT NULL DROP TABLE #SUBSCRIPTION; CREATE TABLE #SUBSCRIPTION (ExtensionSettings xml)

我试图找出XML更新查询的错误。我没有太多在SQL中使用XML的经验,但我认为这应该行得通

我想更新XML中路径值的一个值

以下是我目前正在尝试的:

DECLARE @PATH VARCHAR(500) = 'TEST'

IF OBJECT_ID('tempdb..#SUBSCRIPTION', 'U') IS NOT NULL 
    DROP TABLE #SUBSCRIPTION;

CREATE TABLE #SUBSCRIPTION (ExtensionSettings xml)

INSERT #SUBSCRIPTION
        ( ExtensionSettings )
SELECT '<ParameterValues><ParameterValue><Name>PATH</Name><Value>\\valinor\group\XFER</Value></ParameterValue><ParameterValue><Name>FILENAME</Name><Value>REPORT CARD TEST - SITE - YYYYMMDD</Value></ParameterValue><ParameterValue><Name>FILEEXTN</Name><Value>True</Value></ParameterValue><ParameterValue><Name>RENDER_FORMAT</Name><Value>PDF</Value></ParameterValue><ParameterValue><Name>WRITEMODE</Name><Value>Overwrite</Value></ParameterValue></ParameterValues>' 


SELECT LEN(CAST(ExtensionSettings AS varchar(8000))) DL_XML, CAST(ExtensionSettings AS varchar(8000)) EXT_XML
FROM #SUBSCRIPTION  

-- UPDATE ATTRIBUTE
UPDATE #SUBSCRIPTION
SET ExtensionSettings.modify('replace value of (/ParameterValues/ParameterValue/@Name[.="PATH"])[1] with sql:variable("@PATH")')

SELECT LEN(CAST(ExtensionSettings AS varchar(8000))) DL_XML, CAST(ExtensionSettings AS varchar(8000)) EXT_XML
FROM #SUBSCRIPTION  
SQL Server表示1行受影响,但没有任何更改

我也需要更新其他列,但假设一旦我开始工作,其他列也会以同样的方式工作

你能帮我指出我做错了什么吗?我正在尝试自动化一些SSRS文件共享订阅,但我找到的唯一示例是电子邮件,它们将XML数据编辑为文本

下面是我正在以可读格式处理的XML:

<ParameterValues>
    <ParameterValue>
        <Name>PATH</Name>
        <Value>\\valinor\group\XFER</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>FILENAME</Name>
        <Value>REPORT CARD TEST - SITE - YYYYMMDD</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>FILEEXTN</Name>
        <Value>True</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>RENDER_FORMAT</Name>
        <Value>PDF</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>WRITEMODE</Name>
        <Value>Overwrite</Value>
    </ParameterValue>
</ParameterValues>

经过几个小时的反复试验,我已经找到了基于同一节点^中另一个元素的值更新一个元素的值的语法。我找不到类似的例子

-- UPDATE PATH ATTRIBUTE
UPDATE #SUBSCRIPTION 
SET ExtensionSettings.modify('replace value of (/ParameterValues/ParameterValue[Name="PATH"]/Value/text())[1] with sql:variable("@PATH")')

-- UPDATE FILENAME ATTRIBUTE
UPDATE #SUBSCRIPTION 
SET ExtensionSettings.modify('replace value of (/ParameterValues/ParameterValue[Name="FILENAME"]/Value/text())[1] with sql:variable("@FILENAME")')
之前:

<ParameterValues>
<ParameterValue><Name>PATH</Name><Value>\\valinor\group\XFER</Value></ParameterValue>
<ParameterValue><Name>FILENAME</Name><Value>REPORT CARD TEST - YYYMMDD</Value></ParameterValue>
<ParameterValue><Name>FILEEXTN</Name><Value>True</Value></ParameterValue>
<ParameterValue><Name>RENDER_FORMAT</Name><Value>PDF</Value></ParameterValue>
<ParameterValue><Name>WRITEMODE</Name><Value>Overwrite</Value></ParameterValue>
</ParameterValues>
之后:

<ParameterValues>
<ParameterValue><Name>PATH</Name><Value>\\valinor\group\XFER\TEST\Site1</Value></ParameterValue>
<ParameterValue><Name>FILENAME</Name><Value>0123456X - 20180615</Value></ParameterValue>
<ParameterValue><Name>FILEEXTN</Name><Value>True</Value></ParameterValue
<ParameterValue><Name>RENDER_FORMAT</Name><Value>PDF</Value></ParameterValue>
<ParameterValue><Name>WRITEMODE</Name><Value>Overwrite</Value></ParameterValue>
</ParameterValues>
现在,如果我能想出如何将这些组合成一个语句。但现在已经足够近了


^请随意更正任何不正确的措辞。

我注意到一些事情,ParameterValue是一个重复的节点。不知道如何更新。另外,如果我将更新路径更改为某个伪集合ExtensionSettings.modify'replace value of/ParameterValues/ParameterValueFAKEPATH/@Name[.=path][1],则使用sql:variable@PATH“它仍然会说它更新了1行,所以这可能是一场白费力气的追逐。@sniperd-我明白你说的当它有一条未使用的路径时更新是什么意思。”。我终于明白了。ParameterValue[Name=PATH]/显然是按ParameterValue进行筛选的