Compartilhar via


Construções com suporte em procedimentos armazenados compilados nativamente

Este tópico contém uma lista de recursos com suporte para procedimentos armazenados compilados nativamente (CREATE PROCEDURE (Transact-SQL)):

Para obter informações sobre tipos de dados com suporte em procedimentos armazenados compilados nativamente, consulte Tipos de Dados Com Suporte.

Para obter informações completas sobre construções sem suporte e para obter informações sobre como contornar alguns dos recursos sem suporte em procedimentos armazenados compilados nativamente, consulte Problemas de migração para procedimentos armazenados compilados nativamente. Para obter mais informações sobre recursos sem suporte, consulte Transact-SQL Constructs Not Supported by In-Memory OLTP.

Programação em procedimentos armazenados compilados nativamente

Há suporte para o seguinte:

  • BEGIN ATOMIC (no nível externo do procedimento armazenado), LANGUAGE, ISOLATION LEVEL, DATEFORMAT e DATEFIRST.

  • Declarando variáveis como NULL ou NOT NULL. Se uma variável for declarada como NOT NULL, a declaração deverá ter um inicializador. Se uma variável não for declarada como NOT NULL, um inicializador será opcional.

  • SE e ENQUANTO

  • INSERIR/ATUALIZAR/EXCLUIR

    Não há suporte para subconsultas. Na cláusula WHERE ou HAVING, HÁ suporte para AND e BETWEEN; NÃO há suporte para OR, NOT e IN.

  • Tipos de tabela com otimização de memória e variáveis de tabela.

  • RETORNAR

  • SELECIONAR

  • AJUSTAR

  • TRY/CATCH/THROW

    Para otimizar o desempenho, use um único bloco TRY/CATCH para um procedimento armazenado totalmente compilado nativamente.

Operadores com suporte

Há suporte para os operadores a seguir.

  • Operadores de comparação (Transact-SQL) (por exemplo, >, , <>=e <=) têm suporte em condicionais (IF, WHILE).

  • Operadores unários (+, -).

  • Operadores binários (*, /, +, -, % (modulo)).

    O operador de adição (+) tem suporte em números e cadeias de caracteres.

  • Operadores lógicos (AND, OR, NOT). As instruções OR e NOT são suportadas nas declarações IF e WHILE, mas não nas cláusulas WHERE ou HAVING.

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

Funções internas em procedimentos armazenados compilados nativamente

As funções a seguir têm suporte em restrições padrão em tabelas com otimização de memória e em procedimentos armazenados compilados nativamente.

  • Funções matemáticas: ACOS, ASIN, ATAN, ATN2, COS, COT, DEGREES, EXP, LOG, LOG10, PI, POWER, RADIANS, RAND, SIN, SQRT, SQUARE e TAN

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

  • Funções de cadeia de caracteres: LEN, LTRIM, RTRIM e SUBSTRING

  • Função de identidade: SCOPE_IDENTITY

  • Funções de NULL: ISNULL

  • Funções Uniqueidentifier: NEWID e NEWSEQUENTIALID

  • Funções de erro: ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY e ERROR_STATE

  • Conversões: CAST e CONVERT. Não há suporte para conversões entre cadeias de caracteres Unicode e não Unicode (n(var)char e (var)char).

  • Funções do sistema: @@rowcount. Instruções dentro de procedimentos armazenados compilados nativamente atualizam @@rowcount e você pode usar @@rowcount em um 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 é redefinido para 0 no início e no final da execução de um procedimento armazenado compilado nativamente.

Consultar a área de superfície em procedimentos armazenados compilados de forma nativa

Há suporte para o seguinte:

  • ENTRE

  • Aliases de nomes de coluna (usando a sintaxe AS ou =).

  • CROSS JOIN e INNER JOIN, compatíveis apenas com consultas SELECT.

  • As expressões têm suporte na lista SELECT e na cláusula WHERE (Transact-SQL) se usarem um operador com suporte. Consulte operadores com suporte para obter a lista de operadores com suporte no momento.

  • Predicado de filtro IS [NOT] NULL

  • Tabela com otimização de memória FROM <>

  • O GROUP BY (Transact-SQL) tem suporte, juntamente com as funções de agregação AVG, COUNT, COUNT_BIG, MIN, MAX e SUM. NÃO há suporte para MIN e MAX para os tipos nvarchar, char, varchar, varchar, varbinary e binary. A Cláusula ORDER BY (Transact-SQL) terá suporte com GROUP BY (Transact-SQL) se uma expressão na lista ORDER BY aparecer verbatim na lista GROUP BY. Por exemplo, GROUP BY a + b ORDER BY a + b é suportado, mas GROUP BY a, b ORDER BY a + b não é suportado.

  • Cláusula HAVING, sujeita às mesmas limitações de expressão que a cláusula WHERE.

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

  • ORDER BY 1

  • Predicados que não fazem referência a uma coluna.

  • SELECT, UPDATE e DELETE

  • TOP 1

  • Atribuição de variável na lista SELECT.

  • ONDE... E

1 As cláusulas ORDER BY e TOP são suportadas em procedimentos armazenados compilados nativamente, com algumas restrições.

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

  • Não há suporte para WITH TIES ou PERCENT na TOP cláusula.

  • TOP combinado com ORDER BY não dá suporte a mais de 8.192 ao usar uma constante na TOP cláusula. Esse limite pode ser reduzido caso a consulta contenha junções ou funções de agregação. (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.)

    Você pode obter resultados maiores que 8.192 armazenando o número de linhas em uma variável:

    DECLARE @v INT = 9000  
    SELECT TOP (@v) ... FROM ... ORDER BY ...  
    

No entanto, uma constante na TOP cláusula resulta em um melhor desempenho em comparação com o uso de uma variável.

Essas restrições não se aplicam ao acesso Transact-SQL interpretado em tabelas com otimização de memória.

Auditoria

A auditoria no nível do procedimento tem suporte em procedimentos armazenados compilados nativamente. Não há suporte para auditoria no nível da instrução.

Para obter mais informações sobre auditoria, consulte Criar uma auditoria de servidor e uma especificação de auditoria de banco de dados.

Sugestões de tabela, consulta e junção

Há suporte para o seguinte:

  • Dicas INDEX, FORCESCAN e FORCESEEK, na sintaxe de dicas de tabela ou na Cláusula OPTION (Transact-SQL) da consulta.

  • ORDEM DE FORÇA

  • JUNÇÃO DE LOOP INTERNO

  • OTIMIZAR PARA

Para obter mais informações, veja Dicas (Transact-SQL).

Limitações na classificação

Você pode classificar mais de 8.000 linhas em uma consulta que usa 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 classificar até 8.000 linhas (menos linhas se houver junções).

Se a consulta usar o operador TOP (Transact-SQL) e uma cláusula ORDER BY (Transact-SQL), você poderá especificar até 8.192 linhas para o operador TOP. Se você especificar mais de 8.192 linhas, receberá a mensagem de erro: Msg 41398, Nível 16, Estado 1, Procedure< procedureName>, Line <lineNumber> O operador TOP poderá retornar um máximo de 8192 linhas; <o número> foi solicitado.

Se você não tiver uma cláusula TOP, poderá classificar qualquer número de linhas com ORDER BY.

Se você não usar uma cláusula ORDER BY, poderá 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: Falha ao compilar.

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 linha 8192 só se aplica a TOP N onde N está uma constante, como nos exemplos anteriores. Se você precisar de um valor N maior que 8192, poderá atribuí-lo a uma variável e usar essa variável com TOP.

Exemplo usando uma variável: Compila

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 retornadas: Há dois casos em que isso pode reduzir potencialmente o número de linhas que podem ser retornadas pelo operador TOP:

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

  • Usando funções de agregação ou referências a funções de agregação na cláusula ORDER BY.

A fórmula para calcular o pio caso máximo de N com suporte em TOP N é: N = floor ( 65536 / number_of_tables * 8 + total_size+of+aggs ).

Consulte Também

Procedimentos armazenados compilados nativamente
Problemas de migração para procedimentos armazenados compilados nativamente