Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de dados SQL no Microsoft Fabric
OPENXML fornece uma vista de conjunto de linhas sobre um documento XML. Como OPENXML é um fornecedor de conjuntos de linhas, OPENXML pode ser usado em Transact-SQL instruções em que os fornecedores de conjuntos de linhas, como uma tabela, vista ou a OPENROWSET função, podem aparecer.
Transact-SQL convenções de sintaxe
Sintaxe
OPENXML ( idoc int [ in ]
, rowpattern nvarchar [ in ]
, [ flags byte [ in ] ] )
[ WITH ( SchemaDeclaration | TableName ) ]
Arguments
IDOC
O handle do documento da representação interna de um documento XML. A representação interna de um documento XML é criada chamando sp_xml_preparedocument.
padrão de filas
O padrão XPath é usado para identificar os nós a serem processados como linhas. Os nós provêm do documento XML cujo handle é passado no parâmetro idoc .
flags
Indica o mapeamento usado entre os dados XML e o conjunto de linhas relacional, e como a coluna de spill-over é preenchida. flags é um parâmetro de entrada opcional e pode ser um dos seguintes valores.
| Valor do byte | Description |
|---|---|
0 |
Por defeito, é attribute-centric o mapeamento. |
1 |
Usa o attribute-centric mapeamento. Pode ser combinado com XML_ELEMENTS. Neste caso, attribute-centric aplica-se primeiro o mapeamento. De seguida, element-centric aplica-se o mapeamento para quaisquer colunas restantes. |
2 |
Usa o element-centric mapeamento. Pode ser combinado com XML_ATTRIBUTES. Neste caso, element-centric aplica-se primeiro o mapeamento. De seguida, attribute-centric aplica-se o mapeamento para quaisquer colunas restantes. |
8 |
Pode ser combinado (OR lógico) com XML_ATTRIBUTES ou XML_ELEMENTS. No contexto da recuperação, este flag indica que os dados consumidos não devem ser copiados para a propriedade @mp:xmltextde overflow . |
SchemaDeclaração
Uma definição de esquema da forma: ColNameColType [ ColPattern | MetaProperty ] [ , ColNameColType [ ColPattern | MetaProperty ] ... ]
ColName
O nome da coluna no conjunto de linhas.
ColType
O tipo de dado SQL Server da coluna no conjunto de linhas. Se os tipos de coluna diferirem do tipo de dados xml subjacente ao atributo, ocorre coerção de tipo.
ColPattern
Um padrão opcional e geral de XPath que descreve como os nós XML devem ser mapeados para as colunas. Se o ColPattern não for especificado, ocorre o mapeamento padrão (
attribute-centricouelement-centricmapeamento conforme especificado pelas bandeiras).O padrão XPath especificado como ColPattern é usado para especificar a natureza especial do mapeamento (for
attribute-centriceelement-centricmapeamento) que sobrescreve ou melhora o mapeamento padrão indicado por flags.O padrão geral XPath especificado como ColPattern também suporta as metapropriedades.
MetaPropriedade
Uma das metapropriedades fornecidas por
OPENXML. Se a MetaPropriedade for especificada, a coluna contém a informação fornecida pela metapropriedade. As metapropriedades permitem-lhe extrair informação (como posição relativa e namespace) sobre nós XML. Estas metapropriedades fornecem mais informação do que é visível na representação textual.
Nome da tabela
O nome da tabela que pode ser dado (em vez de SchemaDeclaration), se já existir uma tabela com o esquema desejado e não forem necessários padrões de colunas.
Observações
A WITH cláusula fornece um formato de conjunto de linhas (e informação adicional de mapeamento conforme necessário) usando SchemaDeclaration ou especificando um TableName, já existente. Se a cláusula opcional WITH não for especificada, os resultados são devolvidos em formato de tabela de arestas . As tabelas de arestas representam a estrutura fina do documento XML (como nomes de elementos/atributos, a hierarquia do documento, os namespaces, PIs, etc.) numa única tabela.
A tabela seguinte descreve a estrutura da tabela de aresta .
| Nome da coluna | Tipo de dados | Description |
|---|---|---|
id |
bigint | O ID único do nó documento. O elemento raiz tem um valor 0ID . Os valores negativos de ID são reservados. |
parentid |
bigint | Identifica o pai do nó. O pai identificado por este ID não é necessariamente o elemento pai, mas depende do nodetype nó cujo pai é identificado por este ID. Por exemplo, se o nó for um nó de texto, o seu pai pode ser um nó de atributo.Se o nó estiver ao nível superior do documento XML, é ParentIDNULL. |
nodetype |
int | Identifica o tipo de nó. Este valor é um inteiro que corresponde à numeração do tipo de nó DOM em XML. Os tipos de nós são:1 = Nó elemento2 = Nó de atributo3 = Nó de texto |
localname |
nvarchar | Dá o nome local do elemento ou atributo.
NULL se o objeto DOM não tiver nome. |
prefix |
nvarchar | O prefixo de namespace do nome do nó. |
namespaceuri |
nvarchar | O URI do namespace do nó. Se o valor for NULL, não existe espaço de nomes. |
data type |
nvarchar | O tipo de dado real da linha de elementos ou atributos, caso contrário, é NULL. O tipo de dado é inferido a partir do DTD inline ou do esquema inline. |
prev |
bigint | O ID XML do elemento irmão anterior.
NULL Se não houver um irmão anterior direto. |
text |
ntext | Contém o valor do atributo ou o conteúdo do elemento em forma de texto (ou está NULL se a entrada da tabela de arestas não exigir um valor). |
Examples
A. Use uma instrução SELECT básica com OPENXML
O exemplo seguinte cria uma representação interna da imagem XML usando sp_xml_preparedocument. Uma SELECT instrução que utiliza um OPENXML fornecedor de conjuntos de linhas é então executada contra a representação interna do documento XML.
O valor do flag é definido para 1. Este valor indica attribute-centric o mapeamento. Assim, os atributos XML correspondem às colunas do conjunto de linhas. O padrão de linhas especificado como /ROOT/Customer identifica os <Customers> nós a serem processados.
O parâmetro opcional ColPattern (padrão de coluna) não é especificado porque o nome da coluna corresponde aos nomes dos atributos XML.
O OPENXML fornecedor de conjuntos de linhas cria um conjunto de duas colunas (CustomerID e ContactName) do qual a SELECT instrução recupera as colunas necessárias (neste caso, todas as colunas).
DECLARE @idoc INT, @doc VARCHAR(1000);
SET @doc = '
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
<OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
<OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
<Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
<OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>';
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;
-- Execute a SELECT statement that uses the OPENXML rowset provider.
SELECT *
FROM OPENXML(@idoc, '/ROOT/Customer', 1) WITH (
CustomerID VARCHAR(10),
ContactName VARCHAR(20)
);
Aqui está o conjunto de resultados.
CustomerID ContactName
---------- --------------------
VINET Paul Henriot
LILAS Carlos Gonzlez
Se a mesma SELECT instrução for executada com flags definidos para 2, indicando element-centric o mapeamento, os valores de CustomerID e ContactName para ambos os clientes no documento XML são devolvidos como NULL, porque não há elementos nomeados CustomerID ou ContactName no documento XML.
Aqui está o conjunto de resultados.
CustomerID ContactName
---------- -----------
NULL NULL
NULL NULL
B. Especificar o ColPattern para mapeamento entre colunas e os atributos XML
A consulta seguinte devolve o ID do cliente, data da encomenda, ID do produto e atributos de quantidade do documento XML. O padrão de linha identifica os <OrderDetails> elementos.
ProductID e Quantity são os atributos do <OrderDetails> elemento. No entanto, OrderID, CustomerID, e OrderDate são os atributos do elemento pai (<Orders>).
O ColPattern opcional é especificado para os seguintes mapeamentos:
O
OrderID,CustomerID, eOrderDateno conjunto de linhas mapeiam para os atributos do pai dos nós identificados pelo padrão de linhas no documento XML.A
ProdIDcoluna no conjunto de linhas corresponde aoProductIDatributo, e aQtycoluna no conjunto de linhas corresponde aoQuantityatributo dos nós identificados no padrão de linhas.
Embora o element-centric mapeamento seja especificado pelo parâmetro flags , o mapeamento especificado no ColPattern sobrescrive este mapeamento.
DECLARE @idoc INT, @doc VARCHAR(1000);
SET @doc = '
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order OrderID="10248" CustomerID="VINET" EmployeeID="5"
OrderDate="1996-07-04T00:00:00">
<OrderDetail ProductID="11" Quantity="12"/>
<OrderDetail ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">v
<Order OrderID="10283" CustomerID="LILAS" EmployeeID="3"
OrderDate="1996-08-16T00:00:00">
<OrderDetail ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>';
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;
-- SELECT stmt using OPENXML rowset provider
SELECT *
FROM OPENXML(@idoc, '/ROOT/Customer/Order/OrderDetail', 2) WITH (
OrderID INT '../@OrderID',
CustomerID VARCHAR(10) '../@CustomerID',
OrderDate DATETIME '../@OrderDate',
ProdID INT '@ProductID',
Qty INT '@Quantity'
);
Aqui está o conjunto de resultados.
OrderID CustomerID OrderDate ProdID Qty
------------------------------------------------------------------------
10248 VINET 1996-07-04 00:00:00.000 11 12
10248 VINET 1996-07-04 00:00:00.000 42 10
10283 LILAS 1996-08-16 00:00:00.000 72 3
C. Obter resultados num formato de tabela de arestas
O documento XML de exemplo no exemplo seguinte consiste em <Customers>, <Orders>, e <Order_0020_Details> elementos. Primeiro, sp_xml_preparedocument é chamado para obter um endereço de documento. Este handle do documento é passado para OPENXML.
Na OPENXML instrução, o padrão de linha (/ROOT/Customers) identifica os <Customers> nós a processar. Como a WITH cláusula não é fornecida, OPENXML devolve o conjunto de linhas num formato de tabela de arestas .
Finalmente, a SELECT instrução recupera todas as colunas da tabela de arestas .
DECLARE @idoc INT, @doc VARCHAR(1000);
SET @doc = '
<ROOT>
<Customers CustomerID="VINET" ContactName="Paul Henriot">
<Orders CustomerID="VINET" EmployeeID="5" OrderDate=
"1996-07-04T00:00:00">
<Order_x0020_Details OrderID="10248" ProductID="11" Quantity="12"/>
<Order_x0020_Details OrderID="10248" ProductID="42" Quantity="10"/>
</Orders>
</Customers>
<Customers CustomerID="LILAS" ContactName="Carlos Gonzlez">
<Orders CustomerID="LILAS" EmployeeID="3" OrderDate=
"1996-08-16T00:00:00">
<Order_x0020_Details OrderID="10283" ProductID="72" Quantity="3"/>
</Orders>
</Customers>
</ROOT>';
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;
-- SELECT statement that uses the OPENXML rowset provider.
SELECT * FROM OPENXML(@idoc, '/ROOT/Customers')
EXEC sp_xml_removedocument @idoc;