SQL XML .Modify语法

时间:2018-06-15 16:58:41

标签: sql-server xml

我正在试图弄清楚我的XML更新查询有什么问题。我在SQL中使用XML的经验不多,但我认为这应该有用。

我想更新XML中PATH值的值。

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

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>

1 个答案:

答案 0 :(得分:0)

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

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

现在,如果我能弄清楚如何将这些组合成一个语句。但现在足够接近了。

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