Bagikan melalui


Fitur yang Didukung untuk Modul T-SQL yang Dikompilasi Secara Asli

Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance

Topik ini berisi daftar area permukaan T-SQL dan fitur yang didukung dalam isi modul T-SQL yang dikompilasi secara asli, seperti prosedur tersimpan (CREATE PROCEDURE (Transact-SQL)), fungsi skalar yang ditentukan pengguna, fungsi bernilai tabel sebaris, dan pemicu.

Untuk fitur yang didukung sekeliling definisi modul asli, lihat DDL yang didukung untuk modul T-SQL yang Dikompilasi Secara Asli.

Untuk informasi lengkap tentang konstruksi yang tidak didukung, dan untuk informasi tentang cara mengatasi beberapa fitur yang tidak didukung dalam modul yang dikompilasi secara asli, lihat Masalah Migrasi untuk Prosedur Tersimpan yang Dikompilasi Secara Asli. Untuk informasi selengkapnya tentang fitur yang tidak didukung, lihat Konstruksi Transact-SQL Tidak Didukung oleh OLTP Dalam Memori.

Area Permukaan Kueri dalam Modul Asli

Konstruksi kueri berikut didukung:

Ekspresi CASE: CASE dapat digunakan dalam pernyataan atau klausa apa pun yang memungkinkan ekspresi yang valid.

  • Berlaku untuk: SQL Server 2017 (14.x).
    Dimulai dengan SQL Server 2017 (14.x), pernyataan CASE sekarang didukung untuk modul T-SQL yang dikompilasi secara asli.

Klausa SELECT:

  • Kolom dan alias nama (menggunakan AS atau = sintaks).

  • Subkueri skalar

    • Berlaku untuk: SQL Server 2016 (13.x). Dimulai dengan SQL Server 2016 (13.x), subkueri skalar sekarang didukung dalam modul yang dikompilasi secara asli.
  • PUNCAK*

  • PILIH BERBEDA

    • Berlaku untuk: SQL Server 2016 (13.x). Dimulai dengan SQL Server 2016 (13.x), operator DISTINCT didukung dalam modul yang dikompilasi secara asli.

      • Agregat DISTINCT tidak didukung.
  • UNION dan UNION ALL

    • Berlaku untuk: SQL Server 2016 (13.x). Dimulai dengan operator SQL Server 2016 (13.x), UNION dan UNION ALL sekarang didukung dalam modul yang dikompilasi secara asli.
  • Penetapan variabel

Klausa FROM:

  • TABEL atau variabel tabel yang dioptimalkan memori FROM <>

  • DARI <TVF sebaris yang dikompilasi secara asli>

  • LEFT OUTER JOIN, RIGHT OUTER JOIN, CROSS JOIN DAN INNER JOIN.

    • Berlaku untuk: SQL Server 2016 (13.x). Dimulai dengan SQL Server 2016 (13.x), JOINS sekarang didukung dalam modul yang dikompilasi secara asli.
  • Subkueri [AS] table_alias. Untuk informasi selengkapnya, lihat FROM (Transact-SQL).

    • Berlaku untuk: SQL Server 2016 (13.x). Dimulai dengan SQL Server 2016 (13.x), Subkueri sekarang didukung dalam modul yang dikompilasi secara asli.

Klausa WHERE:

  • Predikat filter ADALAH [NOT] NULL

  • DAN, ANTARA

  • ATAU, TIDAK, DI, ADA

    • Berlaku untuk: SQL Server 2016 (13.x). Dimulai dengan SQL Server 2016 (13.x), operator OR/NOT/IN/EXISTS sekarang didukung dalam modul yang dikompilasi secara asli.

Klausa GROUP BY :

  • Fungsi agregat AVG, COUNT, COUNT_BIG, MIN, MAX, dan SUM.

  • MIN dan MAX tidak didukung untuk jenis nvarchar, char, varchar, varchar, varbinary, dan biner.

Klausa ORDER BY :

  • Tidak ada dukungan untuk DISTINCT dalam klausul ORDER BY .

  • Didukung dengan GROUP BY (Transact-SQL) jika ekspresi dalam daftar ORDER BY muncul verbatim dalam daftar GROUP BY.

    • Misalnya, GROUP BY a + b ORDER BY a + b didukung, tetapi GROUP BY a, b ORDER BY a + b tidak.

Klausa HAVING:

  • Tunduk pada batasan ekspresi yang sama dengan klausa WHERE.

ORDER BY dan TOP didukung dalam modul yang dikompilasi secara asli, dengan beberapa batasan

  • Tidak ada dukungan untuk WITH TIES atau PERCENT dalam klausa TOP .

  • Tidak ada dukungan untuk DISTINCT dalam klausul ORDER BY .

  • TOP yang dikombinasikan dengan ORDER BY tidak mendukung lebih dari 8.192 saat menggunakan konstanta dalam klausa TOP .

    • Batas ini dapat diturunkan jika kueri berisi gabungan atau fungsi agregat. (Misalnya, dengan satu gabungan (dua tabel), batasnya adalah 4.096 baris. Dengan dua gabungan (tiga tabel), batasnya adalah 2.730 baris.)
    • Anda dapat memperoleh hasil yang lebih besar dari 8.192 dengan menyimpan jumlah baris dalam variabel:
DECLARE @v INT = 9000;
SELECT TOP (@v) ... FROM ... ORDER BY ...

Namun, konstanta dalam klausul TOP menghasilkan performa yang lebih baik dibandingkan dengan menggunakan variabel.

Pembatasan pada Transact-SQL yang dikompilasi secara asli tidak berlaku untuk akses Transact-SQL yang ditafsirkan pada tabel yang dioptimalkan memori.

Modifikasi Data

Pernyataan DML berikut didukung.

  • SISIPKAN NILAI (satu baris per pernyataan) dan SISIPKAN ... PILIH

  • UPDATE

  • DELETE

  • WHERE didukung dengan pernyataan UPDATE dan DELETE.

Bahasa kontrol aliran

Konstruksi bahasa kontrol aliran berikut didukung.

Operator yang Didukung

Operator berikut didukung.

  • Operator Perbandingan (Transact-SQL) (misalnya, >, , <>=, dan <=)

  • Operator unary (+, -).

  • Operator biner (*, /, +, -, % (modulo)).

    • Operator plus (+) didukung pada angka dan string.
  • Operator logis (AND, OR, NOT).

  • Operator bitwise ~, &, |, dan ^

  • Operator APPLY

    • Berlaku untuk: SQL Server 2017 (14.x).
      Dimulai dengan SQL Server 2017 (14.x), operator APPLY didukung dalam modul yang dikompilasi secara asli.

Fungsi Bawaan dalam Modul yang Dikompilasi Secara Asli

Fungsi berikut didukung dalam batasan pada tabel yang dioptimalkan memori dan dalam modul T-SQL yang dikompilasi secara asli.

  • Semua Fungsi Matematika (Transact-SQL)

  • Fungsi tanggal: CURRENT_TIMESTAMP, DATEADD, DATEDIFF, DATEFROMPARTS, DATEPART, DATETIME2FROMPARTS, DATETIMEFROMPARTS, DAY, EOMONTH, GETDATE, GETUTCDATE, MONTH, SMALLDATETIMEFROMPARTS, SYSDATETIME, SYSUTCDATETIME, dan YEAR.

  • Fungsi string: LEN, LTRIM, RTRIM, dan SUBSTRING.

    • Berlaku untuk: SQL Server 2017 (14.x).
      Dimulai dengan SQL Server 2017 (14.x), fungsi bawaan berikut juga didukung: TRIM, TRANSLATE, dan CONCAT_WS.
  • Fungsi identitas: SCOPE_IDENTITY

  • Fungsi NULL: ISNULL

  • Fungsi uniqueidentifier: NEWID dan NEWSEQUENTIALID

  • Fungsi JSON

    • Berlaku untuk: SQL Server 2017 (14.x).
      Dimulai dengan SQL Server 2017 (14.x), fungsi JSON didukung dalam modul yang dikompilasi secara asli.
  • Fungsi kesalahan: ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY, dan ERROR_STATE

  • Fungsi Sistem: @@rowcount. Pernyataan di dalam pembaruan prosedur tersimpan yang dikompilasi secara asli @@rowcount dan Anda dapat menggunakan @@rowcount dalam prosedur tersimpan yang dikompilasi secara asli untuk menentukan jumlah baris yang terpengaruh oleh pernyataan terakhir yang dijalankan dalam prosedur tersimpan yang dikompilasi secara asli. Namun, @@rowcount diatur ulang ke 0 pada awal dan di akhir eksekusi prosedur tersimpan yang dikompilasi secara asli.

  • Fungsi keamanan: IS_MEMBER({'group' | 'role'}), IS_ROLEMEMBER ('role' [, 'database_principal']), IS_SRVROLEMEMBER ('role' [, '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().

  • Eksekusi modul asli dapat ditumpuk.

Audit

Audit tingkat prosedur didukung dalam prosedur tersimpan yang dikompilasi secara asli.

Untuk informasi selengkapnya tentang audit, lihat Membuat Audit Server dan Spesifikasi Audit Database.

Petunjuk Tabel dan Kueri

Berikut ini didukung:

Untuk informasi selengkapnya, lihat Petunjuk Kueri (Transact-SQL).

Batasan pengurutan

Anda dapat mengurutkan lebih dari 8.000 baris dalam kueri yang menggunakan TOP (Transact-SQL) dan Klausul ORDER BY (Transact-SQL). Namun, tanpa Order BY Clause (Transact-SQL), TOP (Transact-SQL) dapat mengurutkan hingga 8.000 baris (lebih sedikit baris jika ada gabungan).

Jika kueri Anda menggunakan operator TOP (Transact-SQL) dan Order BY Clause (Transact-SQL), Anda dapat menentukan hingga 8192 baris untuk operator TOP. Jika Anda menentukan lebih dari 8192 baris, Anda mendapatkan pesan kesalahan: Msg 41398, Level 16, State 1, ProcedureName<>, LineNumber> Baris< Operator TOP dapat mengembalikan maksimum 8192 baris; <nomor> diminta.

Jika Anda tidak memiliki klausa TOP, Anda dapat mengurutkan sejumlah baris dengan ORDER BY.

Jika Anda tidak menggunakan klausa ORDER BY, Anda dapat menggunakan nilai bilangan bulat apa pun dengan operator TOP.

Contoh dengan TOP N = 8192: Kompilasi

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  

Contoh dengan TOP N > 8192: Gagal dikompilasi.

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  

Batasan baris 8192 hanya berlaku untuk TOP N di mana N adalah konstanta, seperti dalam contoh sebelumnya. Jika Anda membutuhkan N lebih dari 8192, Anda dapat menetapkan nilai ke variabel dan menggunakan variabel tersebut dengan TOP.

Contoh menggunakan variabel: Mengkompilasi

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  

Batasan pada baris yang dikembalikan: Ada dua kasus di mana itu berpotensi mengurangi jumlah baris yang dapat dikembalikan oleh operator TOP:

  • Menggunakan JOIN dalam kueri. Pengaruh WAN pada batasan tergantung pada rencana kueri.

  • Menggunakan fungsi agregat atau referensi ke fungsi agregat dalam klausa ORDER BY.

Rumus untuk menghitung kasus terburuk maksimum N yang didukung di TOP N adalah: N = floor ( 65536 / number_of_tables * 8 + total_size+of+aggs ).

Lihat Juga

Prosedur Tersimpan yang Dikompilasi Secara Asli
Masalah Migrasi untuk Prosedur Tersimpan yang Dikompilasi Secara Asli