Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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 server 对于XML显式_Sql Server_Xml_Explicit - Fatal编程技术网

Sql server 对于XML显式

Sql server 对于XML显式,sql-server,xml,explicit,Sql Server,Xml,Explicit,假设我有这个设置: -- tables declare @main table (id int, name varchar(20)) declare @subA table (id int, mid int, name varchar(20)) declare @subA1 table (id int, subAid int, name varchar(20)) declare @subA2 table (id int, subAid int, name varchar(20)) declare

假设我有这个设置:

-- tables
declare @main table (id int, name varchar(20))
declare @subA table (id int, mid int, name varchar(20))
declare @subA1 table (id int, subAid int, name varchar(20))
declare @subA2 table (id int, subAid int, name varchar(20))
declare @subB table (id int, mid int, name varchar(20))

-- sample data
insert @main values (1, 'A')
insert @main values (2, 'B')
insert @SubA values (1, 1, 'A')
insert @SubA values (2, 1, 'B')
insert @SubA values (3, 2, 'C')
insert @SubA1 values (1, 1, 'A')
insert @SubA2 values (1, 2, 'A')
insert @SubB values (1, 1, 'A')
insert @SubB values (2, 1, 'B')
insert @SubB values (3, 2, 'C')

-- results
select m.id, m.name, a.name, a1.name, a2.name, b.name
from @main m
left outer join @SubA a on m.id = a.mid
left outer join @SubA1 a1 on a.id = a1.subAid
left outer join @SubA2 a2 on a.id = a2.subAid
left outer join @SubB b on m.id = b.mid
这将返回:

1   A   A   A   NULL    A
1   A   A   A   NULL    B
1   A   B   NULL    A   A
1   A   B   NULL    A   B
2   B   C   NULL    NULL    C
如果我使用“for xml auto”,那么我会得到:

<m id="1" name="A">
  <a name="A">
    <a1 name="A">
      <a2>
        <b name="A" />
        <b name="B" />
      </a2>
    </a1>
  </a>
  <a name="B">
    <a1>
      <a2 name="A">
        <b name="A" />
        <b name="B" />
      </a2>
    </a1>
  </a>
</m>
<m id="2" name="B">
  <a name="C">
    <a1>
      <a2>
        <b name="C" />
      </a2>
    </a1>
  </a>
</m>

然而,这不是我需要的。我想展示的是@main是主表,它有两个子表:@subA和@SubB@SubA也有两个孩子:@SubA1和@SubA2,所以我想回去:

<m id="1" name="A">
  <a name="A">
    <a1 name="A"></a1>
    <a2></a2>    
  </a>
  <a name="B">
    <a1></a1>
    <a2 name="A"></a2>    
  </a>
  <b name="A" />
  <b name="B" />  
</m>
<m id="2" name="B">
  <a name="C">
    <a1></a1>
    <a2></a2>    
  </a>
  <b name="C" />  
</m>

我很确定我将不得不使用“for xml explicit”,但迄今为止我所做的所有尝试都未能获得所需的格式

任何人都可以展示一个以所需格式返回数据的示例查询吗

谢谢,
Mark

不可否认,这并不能回答您的问题,但总的来说,我发现使用XML显式的联合方法是一种很好的方法,因为SQL更易于阅读。例如:


您还可以重新编写查询以控制xml输出,Google
嵌套用于xml查询
。下面是一个使用
FOR XML AUTO
的示例,使用
FOR XML PATH
这一技术可能会获得更好的控制

-- tables
declare @main table (id int, name varchar(20))
declare @subA table (id int, mid int, name varchar(20))
declare @subA1 table (id int, subAid int, name varchar(20))
declare @subA2 table (id int, subAid int, name varchar(20))
declare @subB table (id int, mid int, name varchar(20))

-- sample data
insert @main values (1, 'm(1)')
insert @main values (2, 'm(2)')
insert @SubA values (1, 1, 'm(1)/a(1)')
insert @SubA values (2, 1, 'm(1)/a(2)')
insert @SubA values (3, 2, 'm(2)/a(3)')
insert @SubA1 values (1, 1, 'a(1)/a1(1)')
insert @SubA2 values (1, 1, 'a(1)/a2(1)')
insert @SubA2 values (2, 2, 'a(2)/a2(2)')
insert @SubB values (1, 1, 'm(1)/b(1)')
insert @SubB values (2, 1, 'm(1)/b(2)')
insert @SubB values (3, 2, 'm(2)/b(3)')

SELECT  m.id
       ,m.name
       ,( SELECT    [name]
                   ,( SELECT    [name]
                      FROM      @subA1 AS a1
                      WHERE     a1.subAid = a.id
                    FOR XML AUTO, TYPE
                    )
                   ,( SELECT    [name]
                      FROM      @subA2 AS a2
                      WHERE     a2.subAid = a.id
                    FOR XML AUTO, TYPE
                    )
          FROM      @SubA AS a
          WHERE     m.id = a.mid
        FOR XML AUTO, TYPE
        )
       ,( SELECT    [name]
          FROM      @SubB AS b
          WHERE     m.id = b.mid
        FOR XML AUTO, TYPE
        )
FROM    @main AS m
FOR XML AUTO
返回:

<m id="1" name="m(1)">
  <a name="m(1)/a(1)">
    <a1 name="a(1)/a1(1)" />
    <a2 name="a(1)/a2(1)" />
  </a>
  <a name="m(1)/a(2)">
    <a2 name="a(2)/a2(2)" />
  </a>
  <b name="m(1)/b(1)" />
  <b name="m(1)/b(2)" />
</m>
<m id="2" name="m(2)">
  <a name="m(2)/a(3)" />
  <b name="m(2)/b(3)" />
</m>


谢谢,我还看到了几个使用联合查询的示例,我只是不确定这是否是我需要的!您正在使用哪个版本的SQL Server??SQL Server 2005和更高版本的XML路径比显式路径简单得多……我不能保证它会在2005+框中,因为仍有一些人在2000上运行它,所以它必须在两种平台上都工作。另外,我认为FOR XML路径不会给我生成上面列出的输出所需的灵活性。我很高兴被证明是错的!非常感谢。就原始sql语句而言,它有点“混乱”,但它确实提供了我想要的输出,因此这可能是我最终的答案。不幸的是,我无法使用这种方法。查询可能返回多个“A1”记录,并且不能将多行作为嵌套子查询的一部分返回。