記憶體中的 OLTP 不支援 Transact-SQL 建構

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體

記憶體最佳化資料表、原生編譯預存程序和使用者定義函數,不支援磁碟資料表、轉譯過的 Transact-SQL 預存程序和使用者定義函數所支援的全部 Transact-SQL 介面區。 嘗試使用其中一項不支援的功能時,伺服器會傳回錯誤。

錯誤訊息文字會說明 Transact-SQL 陳述式的類型 (例如功能、作業、選項等) 以及功能的名稱或 Transact-SQL 關鍵字。 大多數不受支援的功能會傳回錯誤 10794,且錯誤訊息文字會指出不受支援的功能。 下表列出可能出現在錯誤訊息文字中的 Transact-SQL 功能和關鍵字,以及解決錯誤的更正動作。

如需記憶體最佳化資料表和原生方式編譯預存程序之支援功能的詳細資訊,請參閱:

使用記憶體中 OLTP 的資料庫

下表列出不支援的 Transact-SQL 功能,以及會出現在與記憶體內部 OLTP 資料庫有關之錯誤訊息文字中的關鍵字。 這個表格也會列出錯誤的解決方法。

類型 名稱 解決方案
選項 自動關閉 具有 MEMORY_OPTIMIZED_DATA 檔案群組的資料庫不支援資料庫選項 AUTO_CLOSE=ON。
選項 ATTACH_REBUILD_LOG 具有 MEMORY_OPTIMIZED_DATA 檔案群組的資料庫不支援 CREATE 資料庫選項 ATTACH_REBUILD_LOG。
功能 DATABASE 快照 具有 MEMORY_OPTIMIZED_DATA 檔案群組的資料庫無法建立資料庫快照。
功能 使用 sync_method 'database snapshot' 或 'database snapshot character' 進行複寫 對於具有 MEMORY_OPTIMIZED_DATA 檔案群組的資料庫,不支援使用 sync_method 'database snapshot' 或 'database snapshot character' 的複寫。
功能 DBCC CHECKDB(檢查資料庫)

DBCC CHECKTABLE
DBCC CHECKDB 會略過資料庫中記憶體最佳化資料表。

DBCC CHECKTABLE 無法檢查記憶體最佳化資料表。

記憶體最佳化資料表

下表列出不支援的 Transact-SQL 功能,和會出現在與記憶體最佳化資料表有關的錯誤訊息文字中的關鍵字。 這個表格也會列出錯誤的解決方法。

類型 名稱 解決方案
功能 開啟 記憶體最佳化資料表不可放置在檔案群組或分割區配置上。 從陳述中移除 ON 條款 CREATE TABLE

所有記憶體最佳化資料表都會對應到記憶體最佳化檔案群組。
資料類型 資料類型名稱 不支援所指的資料類型。 請用其中一種支援的資料類型取代該類型。 如需詳細資訊,請參閱 記憶體內部 OLTP 支援的資料類型
功能 計算欄位 適用於:SQL Server 2014 (12.x) 和 SQL Server 2016 (13.x)
記憶體最佳化資料表中不支援計算資料行。 從 CREATE TABLE 陳述式中移除計算欄位。

Azure SQL Database 和 SQL Server (從 SQL Server 2017 (14.x) 起) 支援經記憶體最佳化之資料表和索引中的計算資料行。
功能 複寫 記憶體最佳化資料表不支援複寫。
功能 FILESTREAM FILESTREAM 儲存體不是記憶體最佳化資料表支援的資料行。 請從資料行定義中移除 FILESTREAM 關鍵字。
功能 SPARSE 記憶體最佳化資料表的資料行不可定義為 SPARSE。 請從資料行定義中移除 SPARSE 關鍵字。
功能 ROWGUIDCOL 記憶體最佳化資料表中的資料行不支援 ROWGUIDCOL 選項。 請從資料行定義中移除 ROWGUIDCOL 關鍵字。
功能 外鍵 適用於:Azure SQL Database 和 SQL Server (從 SQL Server 2016 (13.x) 起)
對於記憶體最佳化資料表,FOREIGN KEY 條件約束僅支援參照其他記憶體最佳化資料表主鍵的外鍵。 如果外鍵參照的是唯一約束,請從資料表定義中移除該約束。

在 SQL Server 2014 (12.x) 中,經記憶體最佳化的資料表不支援 FOREIGN KEY 條件約束。
功能 叢集索引 指定非叢集索引。 對於主索引鍵索引,請務必指定 PRIMARY KEY NONCLUSTERED
功能 交易中的 DDL 記憶體最佳化資料表和原生編譯預存程序無法在使用者交易內容中建立或卸除。 不要啟動交易,且執行 CREATE 或 DROP 語句前,請確保 session 設定 IMPLICIT_TRANSACTIONS 已關閉。
功能 DDL 觸發程序 如果該 DDL 作業有伺服器或資料庫觸發程序,則無法建立或卸除記憶體最佳化資料表和原生編譯預存程序。 移除 CREATE/DROP TABLE 和 CREATE/DROP PROCEDURE 上的伺服器與資料庫觸發器。
功能 EVENT NOTIFICATION 如果該 DDL 作業有伺服器或資料庫事件通知,便無法建立或卸除記憶體最佳化資料表和原生編譯的預存程序。 移除在 CREATE TABLE 或 DROP TABLE 以及 CREATE PROCEDURE 或 DROP PROCEDURE 上的伺服器與資料庫事件通知。
功能 FileTable 記憶體最佳化資料表不可建立為檔案資料表。 將陳述式中的參數 CREATE TABLE 移除
作業 主鍵資料行的更新 記憶體最佳化資料表中的主索引鍵資料行和資料類型無法更新。 如果主索引鍵需要更新,請刪除舊資料列,並插入包含更新之主索引鍵的新資料列。
作業 CREATE INDEX 記憶體最佳化資料表上的索引必須在 CREATE TABLE 陳述式中內嵌指定,或使用 ALTER TABLE 陳述式指定。
作業 CREATE FULLTEXT INDEX 記憶體最佳化資料表中不支援全文檢索索引。
作業 綱要變更 經記憶體最佳化的資料表和原生編譯預存程序不支援特定結構描述變更:
Azure SQL Database 和 SQL Server(從 SQL Server 2017 (14.x) 開始):支援 ALTER TABLE、ALTER PROCEDURE 和 sp_rename 作業。 不支援其他結構描述變更 (例如新增擴充屬性)。

SQL Server 2016 (13.x):支援 ALTER TABLE 和 ALTER PROCEDURE 作業。 不支援其他結構描述變更 (包括 sp_rename)。

SQL Server 2014 (12.x):不支援結構描述變更。 若要變更經記憶體最佳化資料表或原生編譯預存程序的定義,請先卸除物件,然後使用所需的定義重新建立即可。
作業 TRUNCATE TABLE 記憶體最佳化資料表不支援 TRUNCATE 作業。 若要移除資料表中的所有資料列,請使用 DELETE FROM資料表 刪除所有資料列,或刪除並重新建立該資料表。
作業 ALTER AUTHORIZATION 不支援變更現有記憶體最佳化資料表或原生編譯預存程序的擁有者。 請刪除並重新建立資料表或預存程序,以變更擁有權。
作業 ALTER SCHEMA 不支援將現有資料表或原生編譯預存程序轉移到另一個結構描述。 若要在結構描述之間移動,請刪除並重新建立該物件。
作業 DBCC CHECKTABLE 記憶體最佳化資料表不支援 DBCC CHECKTABLE。 若要確認磁碟檢查點檔案的完整性,請執行 MEMORY_OPTIMIZED_DATA 檔案群組的備份。
功能 ANSI_PADDING 關掉 當建立記憶體優化資料表或原生編譯的儲存程序時,會話選項 ANSI_PADDING 必須開啟。 執行 SET ANSI_PADDING ON 後再執行 CREATE 陳述式。
選項 資料壓縮 記憶體最佳化資料表中不支援資料壓縮。 請從資料表定義中移除此選項。
功能 DTC 記憶體最佳化資料表和原生編譯預存程序無法從分散式交易中存取。 請改用 SQL 交易。
作業 記憶體優化資料表作為 MERGE 的目標 記憶體最佳化資料表不能成為 MERGE 作業的目標。 改用 INSERTUPDATEDELETE 語句。

記憶體最佳化資料表上的索引

下表列出可能出現於涉及記憶體最佳化資料表上某個索引錯誤之訊息文字中的 Transact-SQL 功能和關鍵字,以及解決錯誤的更正動作。

類型 名稱 解決方案
功能 已篩選的索引 記憶體最佳化資料表不支援篩選索引。 請從索引指定中省略 WHERE 子句。
功能 包含的資料行 記憶體最佳化資料表並不需要指定內含資料行。 記憶體最佳化資料表的所有資料行都會隱含地包含於每個記憶體最佳化索引中。
作業 DROP INDEX 不支援刪除記憶體最佳化資料表上的索引。 你可以用 ALTER TABLE. 來刪除索引。

如需詳細資訊,請參閱 改變記憶體最佳化資料表
索引選項 索引選項 對於 HASH 索引,僅支援一個索引選項:BUCKET_COUNT。

非叢集雜湊索引

下表列出可能出現於涉及非叢集雜湊索引之錯誤訊息文字中的 Transact-SQL 功能和關鍵字,以及解決錯誤的更正動作。

類型 名稱 解決方案
選項 ASC/DESC 非叢集雜湊索引沒有排序順序。 請從索引鍵指定中移除關鍵字 ASCDESC

原生編譯預存程序和使用者定義函數

下表列出可能出現於涉及原生編譯預存程序和使用者定義函數之錯誤訊息文字中的 Transact-SQL 功能和關鍵字,以及解決錯誤的更正動作。

類型 功能 解決方案
功能 內嵌資料表變數 資料表類型無法以內嵌於變數宣告中的方式宣告。 資料表類型必須用 CREATE TYPE 陳述式明確宣告。
功能 游標 原生編譯的預存程序不支援游標。

從用戶端執行預存程序時,請使用 RPC,而非游標 API。 使用 ODBC 時,請避免使用 Transact-SQL 陳述式 EXECUTE,而是改為直接指定程序名稱。

從 Transact-SQL 批次或其他預存程序執行程序時,避免將資料指標與原生編譯預存程序一起使用。

建立原生編譯預存程序時,請使用以集合為基礎的邏輯或 WHILE 迴圈,而不是使用游標。
功能 非常數參數的預設值 在原生編譯預存程序上使用具有參數的預設值時,值必須為常數。 請從參數宣告中移除任何萬用字元。
功能 外部 無法對 CLR 預存程序執行原生編譯。 要麼移除 AS EXTERNAL 子句,要麼是從語句中移除 NATIVE_COMPILATION 選項 CREATE PROCEDURE 。
功能 編號的預存程序 原生編譯預存程序不可編號。 從 陳述式中移除 ;CREATE PROCEDURE
功能 多列 INSERT ... VALUES 陳述式 無法在原生編譯的儲存程序中,使用相同 INSERT 語句插入多列。 為每一列建立 INSERT 陳述句。
功能 通用資料表運算式 (CTE) 原生編譯的預存程序中不支援通用資料表運算式 (CTE)。 重寫查詢。
功能 運算 不支援 COMPUTE 子句。 請從查詢中將它移除。
功能 選擇進入 SELECT 陳述式不支援搭配 INTO 子句使用。 將查詢重寫為 INSERT INTOTableSELECT
功能 不完整的插入資料行清單 一般而言,在語句中 INSERT 必須為表格中的所有欄位指定值。

不過,我們確實支援 DEFAULT 限制條件和 IDENTITY記憶體優化資料表中的(1,1)欄位。 這些欄位可以從 IDENTITY 欄位清單中省略;如果是 INSERT 欄位,則必須省略。
功能 Function 原生編譯預存程序中不支援某些內建函數。 請從預存程序中移除拒絕的函數。 如需所支援內建函數的詳細資訊,請參閱
原生編譯的 T-SQL 模組支援的功能,或
原生編譯的預存程序
功能 CASE 適用於:SQL Server 2014 (12.x) 和 SQL Server (從 SQL Server 2016 (13.x) 起)
原生編譯預存程序內部的查詢不支援 CASE 運算式。 請為每個案例建立查詢。 如需詳細資訊,請參閱 在原生編譯的預存程序中實作 CASE 運算式

Azure SQL Database 和 SQL Server (從 SQL Server 2017 (14.x) 起) 支援 CASE 運算式。
功能 INSERT 執行 移除參照。
功能 執行 僅支援執行原生編譯預存程序和使用者定義函數。
功能 使用者定義聚合 使用者定義彙總函式不可在原生編譯預存程序中使用。 從程序中移除對該函式的參照。
功能 瀏覽模式中繼資料 原生編譯預存程序不支援瀏覽模式中繼資料。 請確認工作階段選項 NO_BROWSETABLE 已設為 OFF。
功能 DELETE 帶有 FROM 子句 在原生編譯的預存程序中,具有資料表來源的陳述式不支援 DELETE 子句。

DELETEFROM 子句搭配使用時,若該子句用來指明要從中刪除資料的資料表,則受支援。
功能 UPDATE 帶有 FROM 子句 FROM 子句不支援原生UPDATE編譯的儲存程序中的陳述式。
功能 臨時程序 不可對暫存預存程序進行原生編譯。 請建立永久的原生編譯預存程序,或暫存的解譯 Transact-SQL 預存程序。
隔離等級 讀取未認可 原生編譯預存程序中不支援隔離等級 READ UNCOMMITTED。 請使用支援的隔離等級,例如 SNAPSHOT。
隔離等級 讀取已提交 原生編譯預存程序中不支援隔離等級 READ COMMITTED。 請使用支援的隔離等級,例如 SNAPSHOT。
功能 暫存資料表 tempdb 中的資料表不可在原生編譯預存程序中使用。 改用資料表變數,或具有 DURABILITY=SCHEMA_ONLY 的記憶體最佳化資料表。
功能 DTC 記憶體最佳化資料表和原生編譯預存程序無法從分散式交易中存取。 請改用 SQL 交易。
功能 以 RECOMPILE 執行 原生編譯預存程序中不支援 WITH RECOMPILE 選項。
功能 從專用管理員連線執行。 原生編譯預存程序無法從專用管理員連接 (DAC) 執行。 請改用正常連接。
作業 儲存點 原生編譯預存程序不可從擁有使用中儲存點的交易中叫用。 請從交易中移除儲存點。
作業 ALTER AUTHORIZATION 不支援變更現有記憶體最佳化資料表或原生編譯預存程序的擁有者。 請刪除並重新建立資料表或預存程序,以變更擁有權。
運算子 OPENROWSET 不支援此運算子。 請從原生編譯預存程序中移除 OPENROWSET
運算子 OPENQUERY 不支援此運算子。 請從原生編譯預存程序中移除 OPENQUERY
運算子 OPENDATASOURCE 不支援此運算子。 請從原生編譯預存程序中移除 OPENDATASOURCE
運算子 OPENXML 不支援此運算子。 請從原生編譯預存程序中移除 OPENXML
運算子 CONTAINSTABLE 不支援此運算子。 請從原生編譯預存程序中移除 CONTAINSTABLE
運算子 FREETEXTTABLE 不支援此運算子。 請從原生編譯預存程序中移除 FREETEXTTABLE
功能 資料表值函式 資料表值函數無法在原生編譯預存程序中參考。 此限制的可行因應措施是將資料表值函式內的邏輯加入程序主體中。
運算子 CHANGETABLE 不支援此運算子。 請從原生編譯預存程序中移除 CHANGETABLE
運算子 GOTO 不支援此運算子。 請使用其他程序性建構,例如 WHILE。
運算子 OFFSET 不支援此運算子。 請從原生編譯預存程序中移除 OFFSET
運算子 交集 不支援此運算子。 請從原生編譯預存程序中移除 INTERSECT 。 在某些情況下,可以使用 INNER JOIN 獲得相同結果。
運算子 除了 不支援此運算子。 請從原生編譯預存程序中移除 EXCEPT
運算子 套用 適用於:SQL Server 2014 (12.x) 和 SQL Server (從 SQL Server 2016 (13.x) 起)
不支援此運算子。 請從原生編譯預存程序中移除 APPLY

Azure SQL Database 和 SQL Server (從 SQL Server 2017 (14.x) 起) 在原生編譯模組中支援 APPLY 運算子。
運算子 樞紐 不支援此運算子。 請從原生編譯預存程序中移除 PIVOT
運算子 UNPIVOT 不支援此運算子。 請從原生編譯預存程序中移除 UNPIVOT
運算子 包含 不支援此運算子。 請從原生編譯預存程序中移除 CONTAINS
運算子 FREETEXT 不支援此運算子。 請從原生編譯預存程序中移除 FREETEXT
運算子 TSEQUAL 不支援此運算子。 請從原生編譯預存程序中移除 TSEQUAL
運算子 不支援此運算子。 請從原生編譯預存程序中移除 LIKE
運算子 取得下一個值 無法在原生編譯預存程序中參考序列。 請使用解譯的 Transact-SQL 取得值,並將它傳遞至原生編譯預存程序。 欲了解更多資訊,請參閱「在記憶體最佳化資料表中實作IDENTITY」
設定選項 選項 SET 選項無法在原生編譯的儲存程序中更改。 某些選項可以透過 BEGIN ATOMIC 陳述式設定。 如需詳細資訊,請參閱 原生編譯的預存程序 中關於原子區塊的章節。
運算元 TABLESAMPLE 不支援此運算子。 請從原生編譯預存程序中移除 TABLESAMPLE
選項 重新編譯 原生編譯的預存程序會在建立時編譯。 請從程序定義中移除 RECOMPILE

您可以在原生編譯預存程序上執行 sp_recompile,下次執行時就會重新編譯它。
選項 加密 不支援這個選項。 請從程序定義中移除 ENCRYPTION
選項 用於複製 無法建立用於複寫的原生編譯預存程序。 已從程序定義中移除 FOR REPLICATION
選項 用於 XML 不支援這個選項。 請從原生編譯預存程序中移除 FOR XML
選項 供瀏覽 不支援這個選項。 請從原生編譯預存程序中移除 FOR BROWSE
聯結提示 雜訊, MERGE 原生編譯預存程序僅支援巢狀迴圈聯結。 不支援雜湊和合併聯結。 請移除加入提示。
查詢提示 查詢提示 此查詢提示不在原生編譯預存程序內。 如需支援的查詢提示,請參閱查詢提示 (Transact-SQL)
選項 百分比 此選項不支援搭配 TOP 子句使用。 請從原生編譯預存程序的查詢中移除 PERCENT
選項 與平手 適用於:SQL Server 2014 (12.x) 和 SQL Server 2016 (13.x)
此選項不支援搭配 TOP 子句使用。 請從原生編譯預存程序的查詢中移除 WITH TIES

Azure SQL Database 和 SQL Server (從 SQL Server 2017 (14.x) 起) 支援 TOP WITH TIES
彙總函式 彙總函式 並非所有彙總函式都受支援。 如需原生編譯 T-SQL 模組中支援的彙總函式詳細資訊,請參閱原生編譯 T-SQL 模組支援的功能
排名函數 次序函數 原生編譯預存程序中不支援排名函數。 請從程序定義中將它們移除。
函式 Function 不支援此函數。 如需原生編譯 T-SQL 模組中支援的函式詳細資訊,請參閱原生編譯 T-SQL 模組支援的功能
陳述式 陳述式 不支援此陳述。 如需原生編譯 T-SQL 模組中支援的函式詳細資訊,請參閱原生編譯 T-SQL 模組支援的功能
功能 MIN 和 MAX 可與二進位和字元字串並用 彙總函式 MINMAX 不可用於原生編譯預存程序內的字元和二進位字串值。
功能 大家共同組成 在原生編譯的預存程序中,ALL 不得與 GROUP BY 子句並用。 從 GROUP BY 子句中移除 ALL 關鍵字。
功能 GROUP BY () 無法使用空白清單做為群組依據。 移除 GROUP BY 子句,或將資料行納入分組清單。
功能 彙總 ROLLUP 無法與原生編譯預存程序中的 GROUP BY 子句一起使用。 請從程序定義中移除 ROLLUP
功能 CUBE CUBE 無法與原生編譯預存程序中的 GROUP BY 子句一起使用。 請從程序定義中移除 CUBE
功能 分組集合 GROUPING SETS 無法與原生編譯預存程序中的 GROUP BY 子句一起使用。 請從程序定義中移除 GROUPING SETS
功能 開始交易、提交交易,以及回復交易 使用 ATOMIC 區塊控制交易和錯誤處理。 如需詳細資訊,請參閱 Atomic Blocks
功能 內嵌式資料表變數宣告。 資料表變數必須明確參考定義的記憶體最佳化資料表類型。 您應該建立記憶體最佳化資料表類型,並使用該類型來宣告變數,而不是直接內嵌指定型別。
功能 磁碟型資料表 磁碟型資料表無法從原生編譯的預存程序中存取。 移除原生編譯的預存程序中對磁碟型資料表的參考。 或是將磁碟型資料表移轉至經過最佳化的記憶體。
功能 視圖 檢視無法從原生編譯的預存程序中存取。 請參考基底資料表,而不要使用檢視。
功能 資料表值函式 適用於:Azure SQL Database 和 SQL Server (從 SQL Server 2016 (13.x) 起)
多陳述式資料表值函式無法從原生編譯的 T-SQL 模組中存取。 系統支援內嵌資料表值函式,但您必須使用 NATIVE_COMPILATION 來建立。

適用於:SQL Server 2014 (12.x)
您無法透過原生編譯的 T-SQL 模組來參考資料表值函式。
選項 列印 移除參考
功能 DDL 原生編譯 T-SQL 模組內不支援任何 DDL。
選項 STATISTICS XML 不支援。 當你執行查詢時,啟用 STATISTICS XML 狀態下,XML 內容會回傳,卻沒有原生編譯的儲存程序的部分。

存取記憶體最佳化資料表的交易

下表列出可能出現於涉及存取記憶體最佳化資料表之交易錯誤的訊息文字中的 Transact-SQL 功能和關鍵字,以及解決錯誤的更正動作。

類型 名稱 解決方案
功能 儲存點 不支援在存取記憶體最佳化資料表的交易中建立明確的儲存點。
功能 繫結式交易 繫結工作階段無法參與存取記憶體最佳化資料表的交易。 執行程序前,不要繫結工作階段。
功能 DTC 存取記憶體最佳化資料表的交易不可以是分散式交易。