Sql server 修改语法
我试图找出XML更新查询的错误。我没有太多在SQL中使用XML的经验,但我认为这应该行得通 我想更新XML中路径值的一个值 以下是我目前正在尝试的: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)
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进行筛选的