代码之家  ›  专栏  ›  技术社区  ›  Hannover Fist

修改语法

  •  0
  • Hannover Fist  · 技术社区  · 7 年前

    我正试图找出我的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说有一行受到影响,但没有任何更改。

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

    你能帮我指出我做错了什么吗?我正在尝试自动化一些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 回复  |  直到 7 年前
        1
  •  0
  •   Hannover Fist    7 年前

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

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

    现在,如果我能想出如何把它们组合成一个语句。但现在已经够近了。

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