Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 如何在保存为nvarchar(max)的xml数据中插入属性_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 如何在保存为nvarchar(max)的xml数据中插入属性

Sql 如何在保存为nvarchar(max)的xml数据中插入属性,sql,sql-server,tsql,Sql,Sql Server,Tsql,假设有以下XML数据,我想在工资中添加一个属性,如currency=“INR”: 如果此数据存储在nvarchar(max)类型的列中,则即使将数据转换为xml,以下查询也不起作用: UPDATE TABLENAME SET CAST(CAST(COLUMNNAME AS VARCHAR(MAX)) AS XML).modify('insert attribute currency{"INR"} into (/employee/salary)[1]') 因此,请帮助我解决第二点,因为我有

假设有以下XML数据,我想在工资中添加一个属性,如
currency=“INR”

  • 如果此数据存储在
    nvarchar(max)
    类型的列中,则即使将数据转换为
    xml
    ,以下查询也不起作用:

    UPDATE TABLENAME 
    SET CAST(CAST(COLUMNNAME AS VARCHAR(MAX)) AS XML).modify('insert attribute currency{"INR"} into (/employee/salary)[1]')
    
  • 因此,请帮助我解决第二点,因为我有一个列作为nvarchar,并且我需要在保存的xml数据中插入一个属性。

    仅直接用于变量/column,并且只能在
    SET
    子句中使用

    因此,要解决这个问题,因为您将数据存储为
    NVARCHAR
    ,您有两个选择:

  • 更改您的表并使用
    XML
    datatype添加一个新列,将数据从列移动到该列,然后使用
    modify()

  • 创建/声明一个表以将数据存储为
    XML
    ,并执行
    更新

  • 以下是您提供的示例:

    CREATE TABLE T
    (
      Value NVARCHAR(MAX)
    );
    
    INSERT INTO T
    SELECT N'<employee>
               <salary amount="6000"/>
             </employee>';
    
    DECLARE @V XML;
    
    SELECT @V = CAST(Value AS XML)
    FROM T;
    
    SET @V.modify('insert attribute currency{"INR"} into (/employee/salary)[1]');
    
    UPDATE T
    SET Value = CAST(@V AS NVARCHAR(MAX));
    
    SELECT * FROM T;
    
    创建表T
    (
    值NVARCHAR(最大值)
    );
    插入T
    选择N'
    ';
    声明@V XML;
    选择@V=CAST(值为XML)
    从T;
    设置@V.modify('insert attribute currency{“INR”}到(/employee/salary)[1]');
    更新T
    设定值=铸造(@V为NVARCHAR(最大));
    从T中选择*;
    

    只能直接与变量/列一起使用,并且只能在
    集合
    子句中使用

    因此,要解决这个问题,因为您将数据存储为
    NVARCHAR
    ,您有两个选择:

  • 更改您的表并使用
    XML
    datatype添加一个新列,将数据从列移动到该列,然后使用
    modify()

  • 创建/声明一个表以将数据存储为
    XML
    ,并执行
    更新

  • 以下是您提供的示例:

    CREATE TABLE T
    (
      Value NVARCHAR(MAX)
    );
    
    INSERT INTO T
    SELECT N'<employee>
               <salary amount="6000"/>
             </employee>';
    
    DECLARE @V XML;
    
    SELECT @V = CAST(Value AS XML)
    FROM T;
    
    SET @V.modify('insert attribute currency{"INR"} into (/employee/salary)[1]');
    
    UPDATE T
    SET Value = CAST(@V AS NVARCHAR(MAX));
    
    SELECT * FROM T;
    
    创建表T
    (
    值NVARCHAR(最大值)
    );
    插入T
    选择N'
    ';
    声明@V XML;
    选择@V=CAST(值为XML)
    从T;
    设置@V.modify('insert attribute currency{“INR”}到(/employee/salary)[1]');
    更新T
    设定值=铸造(@V为NVARCHAR(最大));
    从T中选择*;
    

    是的-这里有什么问题吗!?!?!?嗨,marc_s,谢谢你快速查看。现在,我已经更新了我的问题。我知道它应该是XML类型,并且肯定会更改为XML,但是如果,它即将这样做,那么会发现这是一个挑战,但无法理解原因,因此,将其发布在这里,并了解如何解决。是的,第一个对我来说很好。你已经知道,唯一的答案是将其更改为XML。同时,最简单的可能是一个简单的
    替换(COLUMNNAME,'salary amount=“”,'salary currency=“INR”amount=“”)
    …是的-这里有什么问题吗!?!?!?嗨,marc_s,谢谢你快速查看。现在,我已经更新了我的问题。我知道它应该是XML类型,并且肯定会更改为XML,但是如果,它即将这样做,那么会发现这是一个挑战,但无法理解原因,因此,将其发布在这里,并了解如何解决。是的,第一个对我来说很好。你已经知道,唯一的答案是将其更改为XML。同时,最简单的可能是一个简单的
    替换(COLUMNNAME,'salary amount=“”,'salary currency=“INR”amount=“”)
    。。。
    CREATE TABLE T
    (
      Value NVARCHAR(MAX)
    );
    
    INSERT INTO T
    SELECT N'<employee>
               <salary amount="6000"/>
             </employee>';
    
    DECLARE @V XML;
    
    SELECT @V = CAST(Value AS XML)
    FROM T;
    
    SET @V.modify('insert attribute currency{"INR"} into (/employee/salary)[1]');
    
    UPDATE T
    SET Value = CAST(@V AS NVARCHAR(MAX));
    
    SELECT * FROM T;