Partilhar via


Funcionalidades Suportadas para Módulos T-SQL Compilados Nativamente

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do Azure

Este tópico contém uma lista da área de abrangência do T-SQL e dos recursos suportados no corpo dos módulos T-SQL compilados nativamente, como procedimentos armazenados (CREATE PROCEDURE (Transact-SQL)), funções escalares definidas pelo utilizador, funções de valor de tabela inline e gatilhos.

Para funcionalidades suportadas em torno da definição de módulos nativos, veja DDL suportado para módulos T-SQL Compilados Nativamente.

Para informações completas sobre construções não suportadas e sobre como contornar algumas das funcionalidades não suportadas em módulos compilados nativamente, consulte Problemas de Migração para Procedimentos Armazenados Compilados Nativamente. Para mais informações sobre funcionalidades não suportadas, consulte Transact-SQL Construções Não Suportadas por In-Memory OLTP.

Área de Superfície de Consulta em Módulos Nativos

São suportados os seguintes construtos de consulta:

Expressão CASE: O CASE pode ser utilizado em qualquer instrução ou cláusula que permita uma expressão válida.

  • Aplica-se a: SQL Server 2017 (14.x).
    A partir do SQL Server 2017 (14.x), as instruções CASE passaram a ser suportadas para módulos T-SQL compilados nativamente.

cláusula SELECT:

  • Colunas e os nomes de pseudónimos (com a sintaxe AS ou =).

  • Subconsultas escalares

    • Aplica-se a: SQL Server 2016 (13.x). A partir do SQL Server 2016 (13.x), subconsultas escalares passaram a ser suportadas em módulos compilados nativamente.
  • INÍCIO*

  • SELECT DISTINCT

    • Aplica-se a: SQL Server 2016 (13.x). A partir do SQL Server 2016 (13.x), o operador DISTINCT é suportado em módulos compilados nativamente.

      • Agregados DISTINCT não são suportados.
  • UNION e UNION ALL

    • Aplica-se a: SQL Server 2016 (13.x). A partir do SQL Server 2016 (13.x), os operadores UNION e UNION ALL passam a ser suportados em módulos compilados nativamente.
  • Atribuições de variáveis

Cláusula FROM:

  • FROM <tabela otimizada para memória ou variável de tabela>

  • DE <TVF compilado nativamente em linha>

  • JUNÇÃO EXTERNA À ESQUERDA, JUNÇÃO EXTERNA À DIREITA, JUNÇÃO CRUZADA e JUNÇÃO INTERNA.

    • Aplica-se a: SQL Server 2016 (13.x). A partir do SQL Server 2016 (13.x), os JOINS passaram a ser suportados em módulos compilados nativamente.
  • Subqueries [AS] table_alias. Para obter mais informações, consulte FROM (Transact-SQL).

    • Aplica-se a: SQL Server 2016 (13.x). A partir do SQL Server 2016 (13.x), as subqueries passaram a ser suportadas em módulos compilados nativamente.

cláusula WHERE:

  • O predicado do filtro É [NÃO] NULO

  • E, ENTRE

  • OU, NÃO, EM, EXISTE

    • Aplica-se a: SQL Server 2016 (13.x). A partir do SQL Server 2016 (13.x), os operadores OR/NOT/IN/EXISTS passam a ser suportados em módulos compilados nativamente.

GROUP BY cláusula:

  • Funções agregadas AVG, COUNT, COUNT_BIG, MIN, MAX e SUM.

  • MIN e MAX não são suportados para os tipos nvarchar, char, varchar, varbinary e binary.

ORDENAR POR cláusula:

  • Não há suporte para DISTINCT na cláusula ORDER BY .

  • É suportado com GROUP BY (Transact-SQL) se uma expressão na lista ORDER BY aparecer literalmente na lista GROUP BY.

    • Por exemplo, AGRUPAR POR a + b ORDENAR POR a + b é suportado, mas AGRUPAR POR a, b ORDENAR POR a + b não é.

cláusula HAVER:

  • Está sujeito às mesmas limitações de expressão que a cláusula WHERE.

ORDER BY e TOP são suportados em módulos compilados nativamente, com algumas restrições

  • Não há suporte para COM IGUALDADES ou PORCENTAGEM na cláusula TOP.

  • Não há suporte para DISTINCT na cláusula ORDER BY .

  • TOP combinado com ORDER BY não suporta mais de 8.192 quando se usa uma constante na cláusula TOP .

    • Este limite pode ser reduzido caso a consulta contenha junções ou funções agregadas. (Por exemplo, com uma junção (duas tabelas), o limite é de 4.096 linhas. Com duas junções (três tabelas), o limite é de 2.730 linhas.)
    • Pode obter resultados superiores a 8.192 armazenando o número de linhas numa variável:
DECLARE @v INT = 9000;
SELECT TOP (@v) ... FROM ... ORDER BY ...

No entanto, uma constante na cláusula TOP resulta em melhor desempenho comparado com a utilização de uma variável.

Estas restrições a Transact-SQL compiladas nativamente não se aplicam ao acesso Transact-SQL interpretado em tabelas otimizadas para memória.

Modificação de Dados

As seguintes declarações DML são suportadas.

  • INSERT VALUES (uma linha por declaração) e INSERT ... SELECT

  • UPDATE

  • DELETE

  • WHERE é suportado com instruções UPDATE e DELETE.

Linguagem de controlo do fluxo

São suportados os seguintes construtos de linguagem de controlo do fluxo.

Operadores Suportados

Os seguintes operadores são suportados.

  • Operadores de Comparação (Transact-SQL) (por exemplo, >, <, >=, e <=)

  • Operadores unários (+, -).

  • Operadores binários (*, /, +, -, % (módulo)).

    • O operador mais (+) é suportado tanto em números como em cadeias.
  • Operadores lógicos (AND, OR, NOT).

  • Operadores bit a bit ~, &, |, e ^

  • Operador APPLY

    • Aplica-se a: SQL Server 2017 (14.x).
      A partir do SQL Server 2017 (14.x), o operador APPLY é suportado em módulos compilados nativamente.

Funções incorporadas em módulos compilados nativamente

As seguintes funções são suportadas em restrições em tabelas otimizadas para memória e em módulos T-SQL compilados nativamente.

  • Todas as Funções Matemáticas (Transact-SQL)

  • Funções de data: CURRENT_TIMESTAMP, DATEADD, DATEDIFF, DATEFROMPARTS, DATEPART, DATETIME2FROMPARTS, DATETIMEFROMPARTS, DAY, EOMONTH, GETDATE, GETUTCDATE, MONTH, SMALLDATETIMEFROMPARTS, SYSDATETIME, SYSUTCDATETIME, YEAR.

  • Funções de string: LEN, LTRIM, RTRIM e SUBSTRING.

    • Aplica-se a: SQL Server 2017 (14.x).
      A partir do SQL Server 2017 (14.x), também são suportadas as seguintes funções integradas: TRIM, TRANSLATE e CONCAT_WS.
  • Funções de Identidade: SCOPE_IDENTITY

  • Funções NULL: ISNULL

  • Funções de identificador único: NEWID e NEWSEQUENTIALID

  • Funções JSON

    • Aplica-se a: SQL Server 2017 (14.x).
      A partir do SQL Server 2017 (14.x), as funções JSON são suportadas em módulos compilados nativamente.
  • Funções de erro: ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY e ERROR_STATE

  • Funções do Sistema: @@rowcount. As instruções dentro de procedimentos armazenados compilados nativamente atualizam @@rowcount e pode usar @@rowcount num procedimento armazenado compilado nativamente para determinar o número de linhas afetadas pela última instrução executada dentro desse procedimento armazenado compilado nativamente. No entanto, @@rowcount é reiniciado para 0 no início e no final da execução de um procedimento armazenado compilado nativamente.

  • Funções de segurança: IS_MEMBER({'group' | 'função'}), IS_ROLEMEMBER ('função' [, 'database_principal']), IS_SRVROLEMEMBER ('função' [, 'login']), ORIGINAL_LOGIN(), SESSION_USER, CURRENT_USER, SUSER_ID(['login']), SUSER_SID(['login'] [, Param2]), SUSER_SNAME([server_user_sid]), SYSTEM_USER, SUSER_NAME, USER, USER_ID(['user']), USER_NAME([id]), CONTEXT_INFO().

  • As execuções de módulos nativos podem ser aninhadas.

Auditing

A auditoria ao nível de procedimentos é suportada em procedimentos armazenados compilados nativamente.

Para mais informações sobre auditoria, consulte Criar uma Especificação de Auditoria de Servidor e Auditoria de Base de Dados.

Sugestões de Tabela e Consulta

São suportados os seguintes:

Para obter mais informações, consulte Sugestões de Consulta (Transact-SQL).

Limitações na Ordenação

Pode ordenar mais de 8.000 linhas numa consulta que use TOP (Transact-SQL) e uma cláusula ORDER BY (Transact-SQL). No entanto, sem a cláusula ORDER BY (Transact-SQL), TOP (Transact-SQL) pode ordenar até 8.000 linhas (menos linhas se houver joins).

Se a sua consulta usar tanto o operador TOP (Transact-SQL) como uma cláusula ORDER BY (Transact-SQL), pode especificar até 8192 linhas para o operador TOP. Se especificar mais de 8192 linhas, recebe a mensagem de erro: Msg 41398, Nível 16, Estado 1, Procedimento< NomeProcedimento>, Linha < númeroLinha> O operador TOP pode devolver um máximo de 8192 linhas; <número> foi solicitado.

Se não tiver uma cláusula TOP, pode ordenar qualquer número de linhas com ORDER BY.

Se não usar uma cláusula ORDER BY, pode usar qualquer valor inteiro com o operador TOP.

Exemplo com TOP N = 8192: Compila

CREATE PROCEDURE testTop  
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION  
  AS  
  BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')  
    SELECT TOP 8192 ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart  
    ORDER BY ShoppingCartId DESC  
  END;  
GO  

Exemplo com TOP N > 8192: Não compila.

CREATE PROCEDURE testTop  
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION  
  AS  
  BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')  
    SELECT TOP 8193 ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart  
    ORDER BY ShoppingCartId DESC  
  END;  
GO  

A limitação de linhas 8192 aplica-se apenas a TOP N onde N é uma constante, como nos exemplos anteriores. Se precisar N de mais do que 8192, pode atribuir o valor a uma variável e usar essa variável com TOP.

Exemplo usando uma variável: Compiles

CREATE PROCEDURE testTop  
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION  
  AS  
  BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')  
    DECLARE @v int = 8193   
    SELECT TOP (@v) ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart  
    ORDER BY ShoppingCartId DESC  
  END;  
GO  

Limitações nas linhas devolvidas: Existem dois casos em que isso pode potencialmente reduzir o número de linhas que podem ser devolvidas pelo operador TOP:

  • Usando JOINs na consulta. A influência dos JOINs na limitação depende do plano de consulta.

  • Usar funções agregadas ou referências a funções agregadas na cláusula ORDER BY.

A fórmula para calcular um máximo N suportado no pior caso em TOP N é: N = floor ( 65536 / number_of_tables * 8 + total_size+of+aggs ).

Ver também

Procedimentos Armazenados Compilados Nativamente
Problemas de Migração para Procedimentos Armazenados Compilados Nativamente