Azure Synapse SQL 中支援的 Transact-SQL 功能
Azure Synapse SQL 是一項巨量數據分析服務,可讓您使用 T-SQL 語言來查詢和分析數據。 您可以使用 SQL Server 和 Azure SQL 資料庫 上使用的標準 ANSI 相容 SQL 語言方言來進行數據分析。
Transact-SQL 語言用於無伺服器 SQL 集區,專用模型可以參考不同的物件,而且在支援的一組功能中有一些差異。 在此頁面中,您可以在 Synapse SQL 的取用模型之間找到高階 Transact-SQL 語言差異。
資料庫物件
Synapse SQL 中的取用模型可讓您使用不同的資料庫物件。 下表顯示所支援物件類型的比較:
Object | 專用 | 無伺服器 |
---|---|---|
表格 | 是 | 否,不支持資料庫內數據表。 無伺服器 SQL 集區只能查詢參考儲存在 Azure Data Lake 記憶體或 Dataverse 中的數據的外部資料表。 |
檢視 | 是。 檢視可以使用 專用模型中提供的查詢語言專案 。 | 是,您可以透過 外部資料表、使用 OPENROWSET 函數的查詢,以及其他檢視來建立檢視。 檢視可以使用 無伺服器模型中提供的查詢語言專案 。 |
結構描述 | 是 | 是,支持架構。 使用架構來隔離不同的租使用者,併為每個架構放置其數據表。 |
暫存資料表 | 是 | 臨時表可能只是用來儲存系統檢視、常值或其他臨時表的一些資訊。 也支援暫存數據表上的UPDATE/DELETE。 您可以將臨時表與系統檢視聯結。 您無法從外部數據表選取數據,將它插入臨時表,或聯結具有外部數據表的臨時表-這些作業將會失敗,因為外部數據和臨時表不能在同一個查詢中混合。 |
使用者定義程式 | 是 | 是,預存程式可以放在任何用戶資料庫中(而非 master 資料庫)。 程式只能讀取外部數據,並使用 無伺服器集區中可用的查詢語言專案 。 |
使用者定義函式 | 是 | 是,僅支援內嵌數據表值函式。 不支援純量使用者定義函式。 |
觸發程序 | No | 否,無伺服器 SQL 集區不允許變更數據,因此觸發程式無法對數據變更做出反應。 |
外部資料表 | 是。 請參閱支持 的數據格式。 | 是, 外部數據表 可供使用,可用來從 Azure Data Lake 記憶體或 Dataverse 讀取數據。 請參閱支持 的數據格式。 |
快取查詢 | 是,多個表單(SSD型快取、記憶體內部、 結果集快取)。 此外,也支持具體化檢視。 | 否,只會快取檔案統計數據。 |
結果集快取 | 是 | 否,不會快取查詢結果。 只會快取檔案統計數據。 |
具體化檢視 | Yes | 否,無伺服器 SQL 集區不支援具體化檢視。 |
數據表變數 | 否,使用臨時表 | 否,不支持數據表變數。 |
數據表散發 | Yes | 否,不支持數據表散發。 |
數據表索引 | Yes | 否,不支持索引。 |
資料表資料分割 | 是。 | 外部數據表不支持數據分割。 您可以使用Hive-partition 資料夾結構分割檔案,並在Spark中建立資料分割數據表。 Spark 資料分割將會 與無伺服器集區同步處理。 如果您不是使用 Spark,您可以在資料夾結構中分割檔案,而且可以在資料夾分割結構上建立 資料分割檢視 ,但無法在分割的資料夾上建立外部資料表。 |
統計資料 | Yes | 是,會在外部檔案上建立統計數據。 |
工作負載管理、資源類別和並行控制 | 是,請參閱 工作負載管理、資源類別和並行控制。 | 否,您無法管理指派給查詢的資源。 無伺服器 SQL 集區會自動管理資源。 |
成本控制 | 是,使用相應增加和相應減少動作。 | 是,您可以使用 Azure 入口網站 或 T-SQL 程式限制無伺服器集區的每日、每周或每月使用量。 |
查詢語言
Synapse SQL 中使用的查詢語言可以根據取用模型,有不同的支援功能。 下表概述 Transact-SQL 方言中最重要的查詢語言差異:
陳述式 | 專用 | 無伺服器 |
---|---|---|
SELECT 語句 | 是。 SELECT 支援 語句,但不支援某些 Transact-SQL 查詢子句,例如 FOR XML/FOR JSON、 MATCH、OFFSET/FETCH。 |
是, SELECT 支援語句,但不支援某些 Transact-SQL 查詢子句,例如 FOR XML、 MATCH、 PREDICT、GROUPNG SETS 和查詢提示。 |
INSERT 語句 | Yes | 否。 使用 Spark 或其他工具將新數據上傳至 Data Lake。 使用 Azure Cosmos DB 搭配高度交易式工作負載的分析記憶體。 您可以使用 CETAS 來建立外部資料表並插入資料。 |
UPDATE 語句 | Yes | 否,使用Spark更新 Parquet/CSV 數據,且變更將會自動在無伺服器集區中使用。 使用 Azure Cosmos DB 搭配高度交易式工作負載的分析記憶體。 |
DELETE 語句 | Yes | 否,使用Spark刪除 Parquet/CSV 數據,且變更將會自動在無伺服器集區中使用。 使用 Azure Cosmos DB 搭配高度交易式工作負載的分析記憶體。 |
MERGE 語句 | 是 (預覽) | 否,使用Spark合併 Parquet/CSV 數據,且變更將會自動在無伺服器集區中使用。 |
CTAS 語句 | Yes | 否, 無伺服器 SQL 集區不支援 CREATE TABLE AS SELECT 語句。 |
CETAS 語句 | 是,您可以使用 CETAS 執行初始載入外部資料表。 | 是,您可以使用 CETAS 執行初始載入外部資料表。 CETAS 支援 Parquet 和 CSV 輸出格式。 |
交易 | Yes | 是,交易僅適用於元數據物件。 |
標籤 | Yes | 否,無伺服器 SQL 集區不支持標籤。 |
數據載入 | 是。 慣用公用程式是 COPY 語句,但系統同時支援 BULK 載入 (BCP) 和 CETAS 來進行數據載入。 | 否,您無法將資料載入無伺服器 SQL 集區,因為資料會儲存在外部記憶體上。 您一開始可以使用 CETAS 語句將資料載入外部資料表。 |
資料匯出 | 是。 使用 CETAS。 | 是。 您可以使用 CETAS,將數據從外部記憶體(Azure Data Lake、Dataverse、Azure Cosmos DB)導出至 Azure Data Lake。 |
類型 | 是,除了 cursor、hierarchyid、ntext、text 和 image、rowversion、Spatial Types、sql_variant 和 xml 以外的所有 Transact-SQL 類型 | 是,除了 cursor、hierarchyid、ntext、text 和 image、rowversion、Spatial Types、sql_variant、xml 和 Table 類型之外,支援所有 Transact-SQL 類型。 請參閱如何在這裡將 Parquet 數據行類型對應至 SQL 類型。 |
跨資料庫查詢 | No | 是,支援跨資料庫查詢和 3 部分名稱參考,包括 USE 語句。 查詢可以參考相同工作區中的無伺服器 SQL 資料庫或 Lake 資料庫。 不支援跨工作區查詢。 |
內建/系統函式 (分析) | 是,除了 CHOOSE 和 PARSE 以外,所有 Transact-SQL 分析、轉換、日期和時間、邏輯、數學函式 | 是,支援所有 Transact-SQL 分析、轉換、 日期和時間、邏輯和 數學 函式。 |
內建/系統函式 (字串) | 是。 除了 STRING_ESCAPE 和 TRANSLATE 以外,所有 Transact-SQL 字串、JSON 和定序函式 | 是。 支援所有 Transact-SQL 字串、 JSON 和定序函式。 |
內建/系統函式 (密碼編譯) | 部分 | HASHBYTES 是無伺服器 SQL 集區中唯一支援的密碼編譯函式。 |
內建/系統數據表值函式 | 是,除了 OPENXML、OPENDATASOURCE、OPENQUERY 和 OPENROWSET 以外,Transact-SQL 數據列集函式除外 | 是,除了 OPENXML、OPENDATASOURCE 和 OPENQUERY 之外,支援所有 Transact-SQL 數據列集函式。 |
內建/系統匯總 | Transact-SQL 內建匯總,除了 CHECKSUM_AGG 和 GROUPING_ID | 是,支援所有 Transact-SQL 內 建匯總 。 |
運算子 | 是,除了 ! 和 之外的所有 Transact-SQL 運算子!> < | 是,支援所有 Transact-SQL 運算符 。 |
控制流程 | 是。 所有 Transact-SQL 控制流程語句,但 CONTINUE、GOTO、RETURN、USE 和 WAITFOR 除外 | 是。 支援所有 Transact-SQL 流程控制語句 。 不支援條件中的 WHILE (...) SELECT 查詢。 |
DDL 語句 (CREATE、 ALTER、 DROP) | 是。 所有適用於支持物件類型的 Transact-SQL DDL 語句 | 是,支援所有適用於支持物件類型的 Transact-SQL DDL 語句。 |
安全性
Synapse SQL 集區可讓您使用內建安全性功能來保護您的數據和控制存取。 下表比較 Synapse SQL 耗用量模型之間的高階差異。
功能 | 專用 | 無伺服器 |
---|---|---|
登入 | N/A(資料庫僅支援自主使用者) | 是,支援伺服器層級Microsoft Entra ID 和 SQL 登入。 |
使用者 | N/A(資料庫僅支援自主使用者) | 是,支援資料庫使用者。 |
自主使用者 | 是。 注意: 只有一個Microsoft Entra 使用者可以不受限制的系統管理員 | 否,不支援自主使用者。 |
SQL 使用者名稱/密碼驗證 | Yes | 是,使用者可以使用其使用者名稱和密碼來存取無伺服器 SQL 集區。 |
Microsoft Entra 驗證 | 是,Microsoft Entra 使用者 | 是,Microsoft Entra 登入,且使用者可以使用其 Microsoft Entra 身分識別來存取無伺服器 SQL 集區。 |
記憶體Microsoft Entra 傳遞驗證 | Yes | 是, Microsoft Entra 傳遞驗證 適用於Microsoft Entra 登入。 如果未指定認證,Microsoft Entra 使用者的身分識別會傳遞至記憶體。 Microsoft SQL 用戶無法使用 Entra 傳遞驗證。 |
記憶體共用存取簽章 (SAS) 令牌驗證 | No | 是,在 EXTERNAL DATA SOURCE 中使用 DATABASE SCOPED CREDENTIAL 搭配共用存取簽章令牌,或搭配共用存取簽章的實例層級 CREDENTIAL。 |
儲存體存取金鑰驗證 | 是,在 EXTERNAL DATA SOURCE 中使用 DATABASE SCOPED CREDENTIAL | 否, 請使用 SAS 令牌 ,而不是記憶體存取金鑰。 |
記憶體受控識別驗證 | 是,使用 受控服務識別認證 | 是,查詢可以使用工作區 受控識別認證 來存取記憶體。 |
儲存體應用程式身分識別/服務主體 (SPN) 驗證 | 是 | 是,您可以使用服務主體應用程式標識碼來建立認證,以在記憶體上進行驗證。 |
伺服器角色 | No | 支援系統管理員、公用和其他伺服器角色。 |
伺服器層級認證 | No | 是,不會使用明確數據源的OPENROWSET 函式會使用伺服器層級認證。 |
許可權 - 伺服器層級 | No | 是,例如, CONNECT ANY DATABASE 讓用戶 SELECT ALL USER SECURABLES 能夠從任何資料庫讀取數據。 |
資料庫角色 | Yes | 是,您可以使用 db_owner 、 db_datareader 和 db_ddladmin 角色。 |
資料庫範圍認證 | 是,用於外部數據源。 | 是,資料庫範圍認證可用於外部數據源,以 定義記憶體驗證方法。 |
許可權 - 資料庫層級 | Yes | 是,您可以授與、拒絕或撤銷資料庫對象的許可權。 |
許可權 - 架構層級 | 是,包括對架構上的使用者/登入授與、拒絕和 REVOKE 許可權的能力 | 是,您可以指定架構層級許可權,包括授與、DENY 和 REVOKE 許可權給架構上的使用者/登入。 |
許可權 - 物件層級 | 是,包括對使用者授與、拒絕和 REVOKE 許可權的能力 | 是,您可以授與、DENY 和 REVOKE 許可權給支援之系統物件上的使用者/登入。 |
許可權 - 資料行層級安全性 | Yes | 檢視的無伺服器 SQL 集區支援資料行層級安全性,而不是外部資料表。 如果是外部數據表,您可以在外部數據表上方建立邏輯檢視,而不是套用數據行層級安全性。 |
資料列層級安全性 | 是 | 否,數據列層級安全性沒有內建支援。 使用自定義檢視作為 因應措施。 |
數據遮罩 | 是 | 否,無伺服器 SQL 集區不支援內建數據遮罩。 使用明確遮罩某些數據行的包裝函式 SQL 檢視作為因應措施。 |
內建/系統安全性與身分識別函式 | 某些 Transact-SQL 安全性函式和運算子:、、、 SESSION_USER SUSER_SNAME USER_NAME EXECUTE AS SUSER_NAME USER IS_ROLEMEMBER SYSTEM_USER IS_MEMBER HAS_DBACCESS CURRENT_USER OPEN/CLOSE MASTER KEY |
支援某些 Transact-SQL 安全性函式和運算符:CURRENT_USER 、、IS_ROLEMEMBER SUSER_NAME SESSION_USER HAS_PERMS_BY_NAME SESSION_CONTEXT IS_MEMBER IS_SRVROLEMEMBER HAS_DBACCESS 、 SUSER_SNAME USER_NAME SYSTEM_USER USER EXECUTE AS 和 。REVERT 安全性函式無法用來查詢外部數據(將結果儲存在可用於查詢中的變數)。 |
透明資料加密 (TDE) | 是 | 否,不支援 透明資料加密。 |
資料探索與分類 | 是 | 否,不支持數據探索和分類。 |
弱點評定 | 是 | 否,無法使用弱點評量。 |
進階威脅防護 | 是 | 否,不支援進階威脅防護。 |
稽核 | 是 | 是, 無伺服器 SQL 集區支援 稽核。 |
防火牆規則 | Yes | 是,可以在無伺服器 SQL 端點上設定防火牆規則。 |
私人端點 | Yes | 是,私人端點可以在無伺服器 SQL 集區上設定。 |
專用 SQL 集區和無伺服器 SQL 集區會使用標準 Transact-SQL 語言來查詢數據。 如需詳細差異,請參閱 Transact-SQL 語言參考。
平台功能
功能 | 專用 | 無伺服器 |
---|---|---|
調整大小 | 是 | 無伺服器 SQL 集區會根據工作負載自動調整。 |
暫停/繼續 | 是 | 無伺服器 SQL 集區會在未使用且在需要時啟用時自動停用。 不需要用戶動作。 |
資料庫備份 | 是 | 否。 數據會儲存在外部系統中(ADLS、Cosmos DB),因此請確定您正在源端備份數據。 請確定您在原始檔控制中使用儲存 SQL 元資料(資料表、檢視、程式定義和使用者許可權)。 Lake 資料庫中的數據表定義會儲存在 Spark 元數據中,因此請確定您也在原始檔控制中保留 Spark 資料表定義。 |
資料庫還原 | 是 | 否。 數據會儲存在外部系統中(ADLS、Cosmos DB),因此您需要復原來源系統以攜帶您的數據。 請確定您的 SQL 元資料(資料表、檢視、程式定義和使用者許可權)位於原始檔控制中,以便重新建立 SQL 物件。 Lake 資料庫中的數據表定義會儲存在 Spark 元數據中,因此請確定您也在原始檔控制中保留 Spark 資料表定義。 |
工具
您可以使用各種工具來連線到 Synapse SQL 來查詢資料。
工具 | 專用 | 無伺服器 |
---|---|---|
Synapse Studio | 是,SQL 腳本 | 是,SQL 腳本可用於 Synapse Studio。 如果您要傳回大量數據,請使用 SSMS 或 ADS,而不是 Synapse Studio。 |
Power BI | Yes | 是,您可以使用 Power BI 在無伺服器 SQL 集區上建立報表。 建議使用匯入模式進行報告。 |
Azure Analysis Service | Yes | 是,您可以使用無伺服器 SQL 集區在 Azure Analysis Service 中載入數據。 |
Azure Data Studio (ADS) | Yes | 是,您可以使用 Azure Data Studio (1.18.0 版或更新版本)來查詢無伺服器 SQL 集區。 支援 SQL 腳本和 SQL 筆記本。 |
SQL Server Management Studio (SSMS) | Yes | 是,您可以使用 SQL Server Management Studio (18.5 版或更新版本)來查詢無伺服器 SQL 集區。 SSMS 只會顯示無伺服器 SQL 集區中可用的物件。 |
注意
您可以使用 SSMS 連線到無伺服器 SQL 集區和查詢。 從 18.5 版開始,部分支援它,您可以使用它來連線和查詢。
大部分的應用程式都使用標準 Transact-SQL 語言可以查詢 Synapse SQL 的專用和無伺服器耗用量模型。
資料存取
分析的數據可以儲存在各種記憶體類型上。 下表列出所有可用的記憶體選項:
儲存體類型 | 專用 | 無伺服器 |
---|---|---|
內部記憶體 | Yes | 否,數據會放在 Azure Data Lake 或 Azure Cosmos DB 分析記憶體中。 |
Azure Data Lake v2 | Yes | 是,您可以使用外部數據表和 函 OPENROWSET 式從 ADLS 讀取數據。 在這裡瞭解如何 設定訪問控制。 |
Azure Blob 儲存體 | Yes | 是,您可以使用外部數據表和 函OPENROWSET 式從 Azure Blob 儲存體 讀取數據。 在這裡瞭解如何 設定訪問控制。 |
Azure SQL/SQL Server (遠端) | No | 否,無伺服器 SQL 集區無法參考 Azure SQL 資料庫。 您可以使用彈性查詢或鏈接的伺服器,從 Azure SQL 參考無伺服器 SQL 集區。 |
Dataverse | 否,您可以使用 無伺服器 SQL 集區中的 Azure Synapse Link(透過 ADLS) 或 Spark,將 Azure Cosmos DB 數據載入專用集區。 | 是,您可以使用適用於 Dataverse 與 Azure Data Lake 的 Azure Synapse 連結來讀取 Dataverse 數據表。 |
Azure Cosmos DB 交易式記憶體 | No | 否,您無法存取 Azure Cosmos DB 容器來更新數據,或從 Azure Cosmos DB 交易式記憶體讀取數據。 使用 Spark 集區來更新 Azure Cosmos DB 交易式記憶體。 |
Azure Cosmos DB 分析記憶體 | 否,您可以使用 無伺服器 SQL 集區中的 Azure Synapse Link,將 Azure Cosmos DB 數據載入專用集區(透過 ADLS)、ADF、Spark 或其他一些載入工具。 | 是,您可以使用 Azure Synapse Link 查詢 Azure Cosmos DB 分析記憶體。 |
Apache Spark 數據表 (在工作區中) | No | 是,無伺服器集區可以使用元數據同步處理來讀取 PARQUET 和 CSV 數據表。 |
Apache Spark 資料表 (遠端) | No | 否,無伺服器集區只能存取在相同 Synapse 工作區的 Apache Spark 集區中建立的 PARQUET 和 CSV 數據表。 不過,您可以手動建立參考外部 Spark 資料表位置的外部數據表。 |
Databricks 資料表 (遠端) | No | 否,無伺服器集區只能存取在相同 Synapse 工作區的 Apache Spark 集區中建立的 PARQUET 和 CSV 數據表。 不過,您可以手動建立參考 Databricks 數據表位置的外部數據表。 |
資料格式
分析的數據可以儲存在各種記憶體格式。 下表列出可分析的所有可用資料格式:
資料格式 | 專用 | 無伺服器 |
---|---|---|
分隔 | 是 | 是,您可以 查詢分隔的檔案。 |
CSV | 是 (不支援多字元分隔符) | 是,您可以 查詢 CSV 檔案。 為了提升效能,請使用 PARSER_VERSION 2.0,以提供 更快的剖析速度。 如果您要將數據列附加至 CSV 檔案,請確定您將 檔案查詢為可附加的。 |
Parquet | 是 | 是,您可以 查詢 Parquet 檔案,包括具有 巢狀類型的檔案。 |
Hive ORC | 是 | 否,無伺服器 SQL 集區無法讀取 Hive ORC 格式。 |
Hive RC | 是 | 否,無伺服器 SQL 集區無法讀取 Hive RC 格式。 |
JSON | Yes | 是,您可以使用分隔文字格式和 T-SQL JSON 函式來查詢 JSON 檔案。 |
Avro | No | 否,無伺服器 SQL 集區無法讀取 Avro 格式。 |
Delta Lake | No | 是,您可以 查詢 Delta Lake 檔案,包括巢 狀類型的檔案。 |
通用資料模型 (CDM) | No | 否,無伺服器 SQL 集區無法讀取使用 Common Data Model 儲存的數據。 |
下一步
如需專用 SQL 集區和無伺服器 SQL 集區最佳做法的其他資訊,請參閱下列文章: