Sql 即使某些节点不';不存在
我正在尝试将XML导入SQL表。问题是,有时候我的XML文件并没有包含所有节点。但如果它们存在,我需要进口 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
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