Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a:SQL Server
Conforme descrito no tópico Binding Relational Data Inside XML, você pode usar a função sql:column(() ao usar de métodos de tipo de dados XML para expor um valor relacional dentro do XQuery.
Por exemplo, o método query() (tipo de dados XML) é usado para especificar uma consulta em relação a uma instância XML armazenada em uma variável ou coluna de tipo de xml. Às vezes, você também pode querer que sua consulta use valores de outra coluna não XML para reunir dados relacionais e XML. Para fazer isso, use a função sql:column().
O valor SQL será mapeado para um valor XQuery correspondente e seu tipo será um tipo base XQuery equivalente ao tipo SQL correspondente.
Sintaxe
sql:column("columnName")
Comentários
Observe que a referência a uma coluna especificada no função de sql:column() dentro de um XQuery refere-se a uma coluna na linha que está sendo processada.
No SQL Server, você só pode fazer referência a uma instância de xml no contexto da expressão de origem de uma instrução XML-DML insert; caso contrário, você não poderá fazer referência a colunas do tipo xml ou um tipo CLR definido pelo usuário.
A função sql:column() não é suportada em operações JOIN. Em vez disso, a operação APPLY pode ser usada.
Exemplos
Um. Usando sql:column() para recuperar o valor relacional dentro do XML
Na construção de XML, o exemplo a seguir ilustra como você pode recuperar valores de uma coluna relacional não XML para vincular XML e dados relacionais.
A consulta constrói XML que tem o seguinte formato:
<Product ProductID="771" ProductName="Mountain-100 Silver, 38" ProductPrice="3399.99" ProductModelID="19"
ProductModelName="Mountain 100" />
Observe o seguinte no XML construído:
Os valores ProductID, ProductNamee ProductPrice valores de atributo são obtidos da tabela Product.
O valor do atributo ProductModelID é recuperado da tabela ProductModel.
Para tornar a consulta mais interessante, o valor do atributo ProductModelName é obtido da coluna CatalogDescription de tipo xml. Como as informações do catálogo do modelo de produto XML não são armazenadas para todos os modelos de produto, a instrução
ifé usada para recuperar o valor somente se ele existir.SELECT P.ProductID, CatalogDescription.query(' declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"; <Product ProductID= "{ sql:column("P.ProductID") }" ProductName= "{ sql:column("P.Name") }" ProductPrice= "{ sql:column("P.ListPrice") }" ProductModelID= "{ sql:column("PM.ProductModelID") }" > { if (not(empty(/pd:ProductDescription))) then attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName } else () } </Product> ') as Result FROM Production.ProductModel PM, Production.Product P WHERE PM.ProductModelID = P.ProductModelID AND CatalogDescription is not NULL ORDER By PM.ProductModelID
Observe o seguinte da consulta anterior:
Como os valores são recuperados de duas tabelas diferentes, a cláusula FROM especifica duas tabelas. A condição na cláusula WHERE filtra o resultado e recupera apenas produtos cujos modelos de produtos têm descrições de catálogo.
O namespace palavra-chave no XQuery Prolog define o prefixo do namespace XML, "pd", que é usado no corpo da consulta. Observe que os aliases de tabela, "P" e "PM", são definidos na cláusula FROM da própria consulta.
A função sql:column() é usada para trazer valores não-XML dentro do XML.
Este é o resultado parcial:
ProductID Result
-----------------------------------------------------------------
771 <Product ProductID="771" ProductName="Mountain-100 Silver, 38"
ProductPrice="3399.99" ProductModelID="19"
ProductModelName="Mountain 100" />
...
A consulta a seguir constrói XML que contém informações específicas do produto. Essas informações incluem o ProductID, ProductName, ProductPrice e, se disponível, o ProductModelName para todos os produtos que pertencem a um modelo de produto específico, ProductModelID=19. O XML é então atribuído à variável @x de tipo de xml.
declare @x xml
SELECT @x = CatalogDescription.query('
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<Product
ProductID= "{ sql:column("P.ProductID") }"
ProductName= "{ sql:column("P.Name") }"
ProductPrice= "{ sql:column("P.ListPrice") }"
ProductModelID= "{ sql:column("PM.ProductModelID") }" >
{ if (not(empty(/pd:ProductDescription))) then
attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName }
else
()
}
</Product>
')
FROM Production.ProductModel PM, Production.Product P
WHERE PM.ProductModelID = P.ProductModelID
And P.ProductModelID = 19
select @x
Ver também
Comparar XML digitado com XML não tipado
dados XML (SQL Server)
Criar instâncias de dados XML
métodos de tipo de dados xml
XML DML (XML Data Modification Language)