我正在试图弄清楚我的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>
答案 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>
现在,如果我能弄清楚如何将这些组合成一个语句。但现在足够接近了。
^请随意纠正任何不正确的措辞。