Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se:SQL Server
Conforme descrito no tópico Vinculando dados relacionais dentro de XML, você pode usar a função sql:column(() ao usar métodos de tipo de dados XML para expor um valor relacional dentro de XQuery.
Por exemplo, o método query() (tipo de dados XML) é usado para especificar uma consulta em uma instância XML armazenada em uma variável ou coluna do tipo xml . Às vezes, você também pode desejar que sua consulta use valores de outra coluna que não seja XML, para agrupar dados relacionais e XML. Para fazer isso, use a função sql:column().
O valor SQL será mapeado para um valor correspondente XQuery e seu tipo será um tipo base XQuery equivalente ao tipo de SQL correspondente.
Sintaxe
sql:column("columnName")
Comentários
Observe que a referência a uma coluna especificada na função sql:column() dentro de um XQuery refere-se a uma coluna na linha que está sendo processada.
No SQL Server, você só pode se referir a uma instância xml no contexto da expressão de origem de uma instrução de inserção XML-DML; caso contrário, você não pode se referir a colunas do tipo xml ou de um tipo CLR definido pelo usuário.
A função sql:column() não é suportada em operações JOIN. Em vez disso, pode ser usada a operação APPLY.
Exemplos
R. Usando sql:column() para recuperar o valor relacional no XML
Na construção de XML, o exemplo a seguir ilustra como você pode recuperar valores de uma coluna relacional não XML para associar dados relacionais e XML.
A consulta constrói XML que tenha a seguinte forma:
<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 dos atributos ProductID, ProductName e ProductPrice são obtidos na 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 do tipo xml. Como as informações do catálogo de modelo do produto XML não são armazenadas para todos os modelos de produtos, a instrução
ifserá 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 na consulta anterior:
Como os valores são recuperados em 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 produto tenham descrições de catálogo.
A palavra-chave namespace no XQuery Prolog define o prefixo de 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 para 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 contenha informações específicas do produto. Tais informações incluem ProductID, ProductName, ProductPrice e, se disponível, ProductModelName de todos os produtos que pertencem a um modelo de produto específico, ProductModelID=19. O XML é então atribuído à @x variável do tipo 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