Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于XML类型列中的匹配项更新XML节点值_Sql_Sql Server_Xml_Tsql - Fatal编程技术网

Sql 基于XML类型列中的匹配项更新XML节点值

Sql 基于XML类型列中的匹配项更新XML节点值,sql,sql-server,xml,tsql,Sql,Sql Server,Xml,Tsql,我有一个带有XML列的SQL表 表结构是 CREATE TABLE [dbo].[UserSettings]( [ID] [int] IDENTITY(1,1) NOT NULL, [UserID] [int] NOT NULL, [UserName] [varchar](100) NULL, [Setting] [xml] NULL, [CreateDate] [datetime] NOT NULL ) 设置xml列如下所示: <

我有一个带有XML列的SQL表

表结构是

CREATE TABLE [dbo].[UserSettings](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [UserID] [int] NOT NULL,    
    [UserName] [varchar](100) NULL, 
    [Setting] [xml] NULL,   
    [CreateDate] [datetime] NOT NULL
)
设置xml列如下所示:

<UserSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <UserID>1</UserID>
  <Reports>
        <string>Report - 1</string>
        <string>Report - 2</string>
        <string>Report - 3</string>
        <string>Report - 4</string>
  </Reports>
</UserSettings>
<UserSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <UserID>1</UserID>
  <Reports>
        <string>Report - One</string>
        <string>Report - Two</string>
        <string>Report - Three</string>     
  </Reports>
</UserSettings>
我想在中更新Report-1到Report-1,Report-2到Report-2

而且,如果有一个值报告-4,那么我想从中删除它

因此,我在专栏中的最终结果应该如下所示:

<UserSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <UserID>1</UserID>
  <Reports>
        <string>Report - 1</string>
        <string>Report - 2</string>
        <string>Report - 3</string>
        <string>Report - 4</string>
  </Reports>
</UserSettings>
<UserSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <UserID>1</UserID>
  <Reports>
        <string>Report - One</string>
        <string>Report - Two</string>
        <string>Report - Three</string>     
  </Reports>
</UserSettings>
编辑: 我尝试过替换方法。我不确定这是否是最有效的方法

update UserSettings
set Setting=REPLACE(convert(varchar(max),Setting),'<string>Report - 1</string>','<string>Report - One</string>')
where convert(varchar(max),Setting) like '%<string>Report - 1</string>%'
编辑:
我读过,但报告的顺序可以是任意顺序。我无法让我的查询使用它。

简单的方法是使用Replace as string,但是,如果您不想在任何地方(例如标记之外)替换该值,则此方法没有用处


你可以尝试另一种方法

与查找和替换(即修改)不同,可以通过XQuery及其FLWOR表达式动态组合XML

SQL


你试过什么?你在哪里卡住了?你读过文档了吗?