Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 即使某些节点不';不存在_Sql_Sql Server_Xml_Nodes_Xmltable - Fatal编程技术网

Sql 即使某些节点不';不存在

Sql 即使某些节点不';不存在,sql,sql-server,xml,nodes,xmltable,Sql,Sql Server,Xml,Nodes,Xmltable,我正在尝试将XML导入SQL表。问题是,有时候我的XML文件并没有包含所有节点。但如果它们存在,我需要进口 SQL查询示例: if exists (select 'True' from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'Books') drop table Books Declare @x xml='<?xml version = "1.0" encoding="Windows-1252" s

我正在尝试将XML导入SQL表。问题是,有时候我的XML文件并没有包含所有节点。但如果它们存在,我需要进口

SQL查询示例:

if exists (select 'True' from INFORMATION_SCHEMA.TABLES 
           where TABLE_NAME  = 'Books') 
     drop table Books

Declare @x xml='<?xml version = "1.0" encoding="Windows-1252" standalone="yes"?>
    <Books>
        <Book>
        <Title>Book1</Title>
        <Author>Mary</Author>
        <Editions>
            <Year>2015</Year>
            <NumCopys>10000</NumCopys>
        </Editions>
    </Book>
    <Book>
        <Title>Book2</Title>
        <Author>John</Author>
        <Editions>
            <Year>2015</Year>
            <NumCopys>10000</NumCopys>
            <Obs>
                <Internal>Great</Internal>
                <Readers>Great</Readers>
            </Obs>
        </Editions>
        <Editions>
            <Year>2016</Year>
            <NumCopys>10000</NumCopys>
            <Obs>
                <Internal>Great</Internal>
                <Readers>Great</Readers>
            </Obs>
        </Editions>
</Book>
</Books>'

select @x

Declare @ndoc int

exec sp_xml_prepareDocument @ndoc OUTPUT, @x

select * 
into Books 
from 
    (select
         Book.x.value('Title[1]', 'nVarchar(50)') as Title,
         Book.x.value('Author[1]', 'nVarchar(60)') as Author,
         Editions.x.value('Year[1]', 'nVarchar(4)') as [Year],
         Editions.x.value('NumCopys[1]', 'int') as NumCopies
         --Obs.x.value('Internal[1]', 'nVarchar(60)') as Internal,
         --Obs.x.value('Readers[1]', 'nVarchar(60)') as Readers
     from
         @x.nodes('/Books/Book') Book(x)
     cross apply
         book.x.nodes('Editions') Editions(x)
     -- cross apply editions.x.nodes('Obs') Obs(x)
    ) as a

exec sp_xml_removeDocument @ndoc 

select * from books
但我想要的是:

Title   Author  Year    NumCopies   Internal    Readers
--------------------------------------------------------
Book1   Mary    2015    10000       Null        Null
Book2   John    2015    10000       Great       Great
Book2   John    2016    10000       Great       Great

我怎么知道

我想我找到了答案-外部应用

if exists (select 'True' from INFORMATION_SCHEMA.TABLES  where TABLE_NAME  = 'Books') drop table Books
Declare @x xml='<?xml version = "1.0" encoding="Windows-1252" standalone="yes"?>
<Books>
  <Book>
    <Title>Book1</Title>
        <Author>Mary</Author>
        <Editions>
            <Year>2015</Year>
        <NumCopys>10000</NumCopys>
    </Editions>
</Book>
<Book>
    <Title>Book2</Title>
    <Author>John</Author>
    <Editions>
        <Year>2015</Year>
        <NumCopys>10000</NumCopys>
            <Obs>
                <Internal>Great</Internal>
                <Readers>Great</Readers>
            </Obs>
        </Editions>
                <Editions>
            <Year>2016</Year>
            <NumCopys>10000</NumCopys>
            <Obs>
                <Internal>Great</Internal>
                <Readers>Great</Readers>
            </Obs>
        </Editions>
    </Book>
</Books>

    select @x

Declare @ndoc int
exec sp_xml_prepareDocument @ndoc OUTPUT, @x

select * into  Books from 
(SELECT 
Book.x.value('Title[1]', 'nVarchar(50)') as Title,
Book.x.value('Author[1]', 'nVarchar(60)') as Author,
Editions.x.value('Year[1]', 'nVarchar(4)') as [Year],
Editions.x.value('NumCopys[1]', 'int') as NumCopys
--Case Obs.x.exists=1 then '' else 'sem nada' end as teste
,Obs.x.value('Internal[1]', 'nVarchar(60)') as Internal,
Obs.x.value('Readers[1]', 'nVarchar(60)') as Readers

FROM @x.nodes('/Books/Book') Book(x)


outer APPLY book.x.nodes('Editions') Editions(x)
    outer APPLY editions.x.nodes('Obs') Obs(x)
    )
    as a

    exec sp_xml_removeDocument @ndoc 
select * from books

无论如何,谢谢大家。卡拉

我假设你写了
sql
,但实际上是指
sql server
-微软RDBMI认为我找到了答案-外部ApplyGreat,你的答案看起来很好,但你应该删除
声明
执行
(使用OPENXML中的
尝试的剩余部分)。
if exists (select 'True' from INFORMATION_SCHEMA.TABLES  where TABLE_NAME  = 'Books') drop table Books
Declare @x xml='<?xml version = "1.0" encoding="Windows-1252" standalone="yes"?>
<Books>
  <Book>
    <Title>Book1</Title>
        <Author>Mary</Author>
        <Editions>
            <Year>2015</Year>
        <NumCopys>10000</NumCopys>
    </Editions>
</Book>
<Book>
    <Title>Book2</Title>
    <Author>John</Author>
    <Editions>
        <Year>2015</Year>
        <NumCopys>10000</NumCopys>
            <Obs>
                <Internal>Great</Internal>
                <Readers>Great</Readers>
            </Obs>
        </Editions>
                <Editions>
            <Year>2016</Year>
            <NumCopys>10000</NumCopys>
            <Obs>
                <Internal>Great</Internal>
                <Readers>Great</Readers>
            </Obs>
        </Editions>
    </Book>
</Books>

    select @x

Declare @ndoc int
exec sp_xml_prepareDocument @ndoc OUTPUT, @x

select * into  Books from 
(SELECT 
Book.x.value('Title[1]', 'nVarchar(50)') as Title,
Book.x.value('Author[1]', 'nVarchar(60)') as Author,
Editions.x.value('Year[1]', 'nVarchar(4)') as [Year],
Editions.x.value('NumCopys[1]', 'int') as NumCopys
--Case Obs.x.exists=1 then '' else 'sem nada' end as teste
,Obs.x.value('Internal[1]', 'nVarchar(60)') as Internal,
Obs.x.value('Readers[1]', 'nVarchar(60)') as Readers

FROM @x.nodes('/Books/Book') Book(x)


outer APPLY book.x.nodes('Editions') Editions(x)
    outer APPLY editions.x.nodes('Obs') Obs(x)
    )
    as a

    exec sp_xml_removeDocument @ndoc 
select * from books
 Title  Author  Year    NumCopys    Internal    Readers
 Book1  Mary    2015    10000       NULL        NULL
 Book2  John    2015    10000       Great       Great
 Book2  John    2016    10000       Great       Great