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.
Este artigo descreve as diferenças entre o Entity SQL e o Transact-SQL.
Suporte a herança e relações
O SQL da entidade funciona diretamente com esquemas de entidade conceitual e dá suporte a recursos de modelo conceitual, como herança e relações.
Ao trabalhar com herança, geralmente é útil selecionar instâncias de um subtipo de uma coleção de instâncias de supertipo. O operador oftype no Entity SQL (semelhante a oftype em Sequências de C#) fornece essa funcionalidade.
Suporte para coleções
O SQL de entidade trata as coleções como entidades de primeira classe. Por exemplo:
As expressões de coleção são válidas em uma cláusula
from.As subconsultas
ineexistsforam generalizadas para permitir quaisquer coleções.Um subconsulta é um tipo de coleção.
e1 in e2eexists(e)são os constructos sql de entidade para executar essas operações.Operações de conjunto, como
union,intersecteexcept, agora operam em coleções.As junções funcionam em coleções.
Suporte para expressões
O Transact-SQL tem subconsultas (tabelas) e expressões (linhas e colunas).
Para dar suporte a coleções e coleções aninhadas, o Entity SQL torna tudo uma expressão. O SQL da entidade é mais composável do que o Transact-SQL— cada expressão pode ser usada em qualquer lugar. As expressões de consulta sempre resultam em coleções dos tipos projetados e podem ser usadas em qualquer lugar em que uma expressão de coleção seja permitida. Para obter informações sobre expressões Transact-SQL que não têm suporte no SQL da Entidade, consulte Expressões sem suporte.
A seguir estão todas as consultas SQL de entidade válidas:
1+2 *3
"abc"
row(1 as a, 2 as b)
{ 1, 3, 5}
e1 union all e2
set(e1)
Tratamento uniforme de subconsultas
Dada a sua ênfase em tabelas, o Transact-SQL realiza a interpretação contextual de subconsultas. Por exemplo, uma subconsulta na from cláusula é considerada um multiconjunto (tabela). Mas a mesma subconsulta usada na select cláusula é considerada uma subconsulta escalar. Da mesma forma, uma subconsulta usada no lado esquerdo de um operador in é considerada uma subconsulta escalar, embora espere-se que o lado direito seja um subconsulta multiset.
O SQL da entidade elimina essas diferenças. Uma expressão tem uma interpretação uniforme que não depende do contexto no qual ela é usada. O Entity SQL considera todas as subconsultas multiset. Se desejar obter um valor escalar da subconsulta, o Entity SQL oferece o operador anyelement, que atua sobre uma coleção (neste caso, a subconsulta) e extrai um valor único da coleção.
Evitando coerções implícitas para subconsultas
Um efeito colateral relacionado ao tratamento uniforme de subconsultas é a conversão implícita de subconsultas em valores escalares. Especificamente, no Transact-SQL, um multiconjunto de linhas (com um único campo) é convertido implicitamente em um valor escalar cujo tipo de dados é o do campo.
O SQL da entidade não dá suporte a essa coerção implícita. O Entity SQL fornece o operador ANYELEMENT para extrair um valor singleton de uma coleção, e uma cláusula select value para evitar criar um wrapper de linha durante uma expressão de consulta.
Select Value: evitando o wrapper de linha implícito
A cláusula select em uma subconsulta do Transact-SQL cria implicitamente um wrapper de linha ao redor dos itens na cláusula. Isso implica que não podemos criar coleções de escalares ou objetos. O Transact-SQL permite uma coerção implícita entre um rowtype com um campo e um valor singleton do mesmo tipo de dados.
Entity SQL fornece a cláusula select value para ignorar a construção implícita de linha. Somente um item pode ser especificado em uma select value cláusula. Quando tal cláusula é usada, nenhum wrapper de linha é construído ao redor dos itens na cláusula select, e uma coleção da forma desejada pode ser gerada, por exemplo, select value a.
O SQL da entidade também fornece o construtor de linhas para construir linhas arbitrárias.
select usa um ou mais elementos na projeção e resulta em um registro de dados com campos:
select a, b, c
Correlação à esquerda e aliases
No Transact-SQL, as expressões em um determinado escopo (uma única cláusula como select ou from) não podem referenciar expressões definidas anteriormente no mesmo escopo. Alguns dialetos do SQL (incluindo Transact-SQL) dão suporte a formas limitadas destes na from cláusula.
Entity SQL generaliza as correlações à esquerda na cláusula from e as trata uniformemente. Expressões na from cláusula podem referenciar definições anteriores (definições à esquerda) na mesma cláusula sem a necessidade de sintaxe adicional.
Entity SQL também impõe restrições adicionais às consultas que envolvem group by cláusulas. As expressões na cláusula select e na cláusula having dessas consultas podem se referir apenas às chaves group by através dos aliases. O constructo a seguir é válido em Transact-SQL mas não está no SQL da Entidade:
SELECT t.x + t.y FROM T AS t group BY t.x + t.y
Para fazer isso no Entity SQL:
SELECT k FROM T AS t GROUP BY (t.x + t.y) AS k
Referenciando colunas (propriedades) de tabelas (coleções)
Todas as referências de coluna no Entity SQL devem ser qualificadas com o alias da tabela. O constructo a seguir (supondo que a seja uma coluna válida da tabela T) é válido em Transact-SQL mas não no Entity SQL.
SELECT a FROM T
O formulário do Entity SQL é
SELECT t.a AS A FROM T AS t
Os aliases de tabela são opcionais na from cláusula. O nome da tabela é usado como alias implícito. O SQL da entidade também permite o seguinte formulário:
SELECT Tab.a FROM Tab
Navegação por meio de objetos
Transact-SQL usa a notação "." para referenciar colunas de (uma linha de) uma tabela. O SQL da entidade estende essa notação (emprestada de linguagens de programação) para dar suporte à navegação por meio de propriedades de um objeto.
Por exemplo, se p for uma expressão do tipo Pessoa, a seguir está a sintaxe sql da entidade para referenciar a cidade do endereço dessa pessoa.
p.Address.City
Sem suporte para *
O Transact-SQL dá suporte à sintaxe * não qualificada como um alias da linha inteira e à sintaxe * qualificada (t.*) como um atalho para os campos dessa tabela. Além disso, o Transact-SQL permite uma agregação count(*) especial, que inclui nulos.
O SQL da entidade não dá suporte ao constructo * . Transact-SQL consultas do formulário select * from T e select T1.* from T1, T2... podem ser expressas no SQL da Entidade como select value t from T as t e select value t1 from T1 as t1, T2 as t2..., respectivamente. Além disso, esses constructos manipulam a herança (substituição de valor), enquanto as select * variantes são restritas às propriedades de nível superior do tipo declarado.
O SQL da entidade não dá suporte à agregação count(*) . Use count(0) em seu lugar.
Alterações em group by
O Entity SQL dá suporte ao aliasing das chaves group by. As expressões na cláusula select e na cláusula having devem fazer referência às chaves group by através desses alias. Por exemplo, esta sintaxe do Entity SQL:
SELECT k1, count(t.a), sum(t.a)
FROM T AS t
GROUP BY t.b + t.c AS k1
... é equivalente ao seguinte Transact-SQL:
SELECT b + c, count(*), sum(a)
FROM T
GROUP BY b + c
Agregações baseadas em coleção
O SQL da entidade dá suporte a dois tipos de agregações.
As agregações baseadas em coleção operam em coleções e geram o resultado agregado. Elas podem aparecer em qualquer lugar da consulta e não exigem uma group by cláusula. Por exemplo:
SELECT t.a AS a, count({1,2,3}) AS b FROM T AS t
O SQL da entidade também dá suporte a agregações no estilo SQL. Por exemplo:
SELECT a, sum(t.b) FROM T AS t GROUP BY t.a AS a
Uso da cláusula ORDER BY
Transact-SQL permite que as cláusulas ORDER BY sejam especificadas somente no bloco superior SELECT .. FROM .. WHERE . No Entity SQL, você pode usar uma expressão aninhada ORDER BY e ela pode ser colocada em qualquer lugar na consulta, mas a ordenação em uma consulta aninhada não é preservada.
-- The following query will order the results by the last name
SELECT C1.FirstName, C1.LastName
FROM AdventureWorks.Contact AS C1
ORDER BY C1.LastName
-- In the following query ordering of the nested query is ignored.
SELECT C2.FirstName, C2.LastName
FROM (SELECT C1.FirstName, C1.LastName
FROM AdventureWorks.Contact as C1
ORDER BY C1.LastName) as C2
Identificadores
No Transact-SQL, a comparação de identificadores baseia-se na ordenação do banco de dados atual. No Entity SQL, os identificadores são sempre insensíveis a maiúsculas e sensíveis a acentos (ou seja, Entity SQL distingue entre caracteres acentuados e não acentuados; por exemplo, 'a' não é igual a 'ấ'). O SQL de entidade trata versões de letras que aparecem da mesma forma, mas são de páginas de código diferentes como caracteres diferentes. Para obter mais informações, consulte Conjunto de Caracteres de Entrada.
Funcionalidade Transact-SQL não disponível no Entity SQL.
A funcionalidade de Transact-SQL a seguir não está disponível no Entity SQL.
DML
Atualmente, o SQL da entidade não fornece suporte para instruções DML (inserir, atualizar, excluir).
DDL (Linguagem de Definição de Dados)
O SQL da entidade não oferece suporte para DDL na versão atual.
Programação imperativa
O SQL da entidade não oferece suporte para programação imperativa, ao contrário do Transact-SQL. Em vez disso, use uma linguagem de programação.
Funções de agrupamento
O SQL da entidade ainda não fornece suporte para funções de agrupamento (por exemplo, CUBE, ROLLUP e GROUPING_SET).
Funções analíticas
O SQL da entidade não fornece (ainda) suporte para funções analíticas.
Funções embutidas, operadores
O SQL de entidade dá suporte a um subconjunto de funções e operadores internos do Transact-SQL. É provável que esses operadores e funções sejam suportados pelos principais provedores de lojas. O Entity SQL usa as funções específicas de armazenamento declaradas em um manifesto do provedor. Além disso, o Entity Framework permite que você declare funções de repositório existentes internas e definidas pelo usuário para uso do Entity SQL.
Dicas
O Entity SQL não oferece mecanismos para dicas de consulta.
Resultados da consulta em lote
O Entity SQL não dá suporte ao processamento de resultados de consultas por lote. Por exemplo, a sintaxe do Transact-SQL a seguir é válida (enviando como um lote):
SELECT * FROM products;
SELECT * FROM categories;
No entanto, não há suporte para o SQL de entidade equivalente:
SELECT value p FROM Products AS p;
SELECT value c FROM Categories AS c;
O SQL da entidade dá suporte apenas a uma instrução de consulta resultante por comando.