【问题标题】:XML name space prefix 'json' declaration is missing for FOR XML column name 'Value/@json:ValueType'FOR XML 列名称“Value/@json:ValueType”缺少 XML 名称空间前缀“json”声明
【发布时间】:2018-07-02 14:02:16
【问题描述】:

我正在开发一个项目,我正在编写的存储过程正在生成 XML 格式的输出。我想将命名空间添加到“主”节点并将 JSON ValueType 添加到子节点。以下是我的代码:

--- Fake tables in stored procedure
create table #Cdetails(cid int, cidtype varchar(5), name varchar(5), age int)

insert into #Cdetails
values (1001, 'N', 'John', 12), (1002, 'U', 'Rick', 19),
       (1003, 'N', 'Diane', 25), (1004, 'N', 'Kippy', 26)

--Output of stored procedure 

create table #final(cid int, cidtype varchar(5), xml_data xml)

insert into #final
    select
        cid = c1.cid,
        cidtype = c1.cidtype,
        case 
           when c1.cidtype = 'N' 
              then (select 
                        'Value/@json:ValueType'='Number',
                        ID = cd1.cid,
                        details = (select  
                                       cd1.name, cd1.age
                                   for xml path(''), type)
                    from  
                        #Cdetails cd1
                    where 
                        cd1.cid = c1.cid
                    for xml path('Main'))
           when c1.cidtype = 'N' 
              then (select 
                        ID = cd1.cid,
                        details = 'Null'            
                    from 
                        #Cdetails cd1
                    where 
                        cd1.cid = c1.cid
                    for xml path('Main')) 
        end as 'xml_data'
    from 
        #Cdetails c1 

;WITH XMLNAMESPACES ('http://www.integround.com/json' as json)  
SELECT * 
FROM #final 
WHERE xml_data IS NOT NULL
FOR XML PATH('Main')

drop table #Cdetails, #final

在此过程中,XML 是根据 CIDType 条件生成的。所以我目前的输出是:

我想将命名空间添加到“主”节点并将 JSON 属性添加到子节点。

错误

FOR XML 列名称“Value/@json:ValueType”缺少 XML 名称空间前缀“json”声明。

期望的输出:

有什么帮助吗?!

【问题讨论】:

    标签: sql json sql-server xml xml-namespaces


    【解决方案1】:

    XML Construction 能帮到你吗?

    DECLARE @cdetails table(
      cid INT, cidtype VARCHAR(5), name VARCHAR(5), age INT
    );
    
    INSERT INTO @cdetails VALUES
      (1001, 'N', 'John', 22), (1002, 'U', 'Rick', 21),
      (1003, 'N', 'Diane', 25), (1004, 'N', 'Kippy', 26);
    
    SELECT
      cid, cidtype,
      CAST('' AS XML).query('
    <Main xmlns:json="http://www.samplenamespace.com/json">
      <ID json:ValueType="Number">{sql:column("cid")}</ID>
      {
        if( sql:column("cidtype")="N" ) then
          <details>
            <name>{sql:column("name")}</name>
            <age>{sql:column("age")}</age>
          </details>
        else <details>Null</details>
      }
    </Main>
      ')
    FROM @cdetails;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 2019-07-14
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多