適用於: SQL Server 2025 (17.x)
Azure SQL Database
SQL database in Microsoft Fabric
建立外部模型物件,其中包含 AI 模型推斷端點的位置、驗證方法和用途。
語法
CREATE EXTERNAL MODEL external_model_object_name
[ AUTHORIZATION owner_name ]
WITH
( LOCATION = '<prefix>://<path>[:<port>]'
, API_FORMAT = '<OpenAI, Azure OpenAI, etc>'
, MODEL_TYPE = EMBEDDINGS
, MODEL = 'text-embedding-model-name'
[ , CREDENTIAL = <credential_name> ]
[ , PARAMETERS = '{"valid":"JSON"}' ]
[ , LOCAL_RUNTIME_PATH = 'path to the ONNX runtime files' ]
);
論點
external_model_object_name
指定外部模型的使用者定義名稱。 這個名稱在資料庫內必須是唯一的。
owner_name
指定擁有外部模型的使用者或角色名稱。 如果未指定,則會將擁有權提供給目前的使用者。 視許可權和角色而定,必須授與明確許可權給使用者使用特定的外部模型。
位置
提供 AI 模型推斷端點的連線通訊協議和路徑。
API_FORMAT
AI 模型推斷端點提供者的 API 訊息格式。
接受的值包括:
Azure OpenAIOpenAIOllamaONNX Runtime
MODEL_TYPE
從 AI 模型推斷端點位置存取的模型類型。
接受的值包括:
EMBEDDINGS
型
AI 提供者所裝載的特定模型。 例如 text-embedding-ada-002、text-embedding-3-large 或 o3-mini。
憑據
指出哪個 DATABASE SCOPED CREDENTIAL 物件與 AI 模型推斷端點搭配使用。 如需有關已接受認證類型和命名規則的詳細資訊,請參閱 sp_invoke_external_rest_endpoint或本文的 一 節。
參數
有效的 JSON 字串,其中包含要附加至 AI 模型推斷端點要求訊息的執行階段參數。 例如:
'{ "dimensions": 1536 }'
LOCAL_RUNTIME_PATH
LOCAL_RUNTIME_PATH 指定 ONNX 執行階段可執行檔所在的本機 SQL Server 上的目錄。
權限
外部模型建立和改變
ALTER ANY EXTERNAL MODEL需要或CREATE EXTERNAL MODEL資料庫許可權。
例如:
GRANT CREATE EXTERNAL MODEL TO [<PRINCIPAL>];
或
GRANT ALTER ANY EXTERNAL MODEL TO [<PRINCIPAL>];
外部模型授與
若要在 AI 函式中使用外部模型,必須將主體授與它的能力 EXECUTE 。
例如:
GRANT EXECUTE ON EXTERNAL MODEL::MODEL_NAME TO [<PRINCIPAL>];
GO
重試計數
如果內嵌呼叫遇到指出暫時問題的 HTTP 狀態代碼,您可以設定要求來自動重試。 若要指定重試次數,請將下列 JSON 新增至 PARAMETERS 上的 EXTERNAL MODEL。 應該 <number_of_retries> 是介於零 (0) 和十 (10) 之間的整數,包括在內,而且不能是 NULL 或負數。
{ "sql_rest_options": { "retry_count": <number_of_retries> } }
例如,若要將 設定 retry_count 為 3,您會撰寫下列 JSON 字串:
{ "sql_rest_options": { "retry_count": 3 } }
其他參數的重試計數
只要是有效的 JSON 字串,重試計數也可以與其他參數結合。
{ "dimensions": 725, "sql_rest_options": { "retry_count": 5 } }
備註
HTTPS 和 TLS
參數僅支援設定為使用 HTTPS 搭配 TLS 加密通訊協定的 LOCATION AI 模型推斷端點。
接受的 API 格式和模型類型
下列各節概述每個 MODEL_TYPE的已接受 API 格式。
EMBEDDINGS 的API_FORMAT
下表概述模型類型的 API 格式和 URL 端點結構 EMBEDDINGS 。 若要檢視特定的承載結構,請使用 [API 格式] 資料行中的連結。
| API 格式 | 位置路徑格式 |
|---|---|
| Azure OpenAI | https://{endpoint}/openai/deployments/{deployment-id}/embeddings?api-version={date} |
| OpenAI | https://{server_name}/v1/embeddings |
| Ollama | https://localhost:{port}/api/embed |
建立內嵌端點
如需建立內嵌端點的詳細資訊,請針對適當的 AI 模型推斷端點提供者使用這些連結:
EXTERNAL MODEL 的認證名稱規則
所建立 DATABASE SCOPED CREDENTIAL 的 EXTERNAL MODEL 必須遵循特定的下列規則:
必須是有效的URL
URL 網域必須是allowlist中包含的其中一個網域
URL 不得包含查詢字串
所呼叫 URL 的通訊協定 + 完整功能變數名稱 (FQDN) 必須符合認證名稱的 Protocol + FQDN
所呼叫 URL 路徑的每個部分都必須與認證名稱中 URL 路徑的個別部分完全相符
認證必須指向比要求 URL 更泛型的路徑。 例如,為路徑
https://northwind.azurewebsite.net/customers建立的認證無法用於URLhttps://northwind.azurewebsite.net
定序和認證名稱規則
RFC 3986 第 6.2.2.1 節 指出:「當 URI 使用泛型語法的元件時,元件語法等價規則一律適用;也就是說,配置和主機不區分大小寫,而 RFC 7230 第 2.7.3 節 提到「所有其他專案都會以區分大小寫的方式進行比較」。
由於資料庫層級有定序規則集,因此會套用下列邏輯,以便與資料庫定序規則一致,以及先前所述的 RFC。 (描述的規則可能比 RFC 規則更嚴格,例如,如果資料庫設定為使用區分大小寫的定序):
使用 RFC 檢查 URL 和認證是否相符,這意味著:
- 使用不區分大小寫的定序檢查設定和主機 (
Latin1_General_100_CI_AS_KS_WS_SC) - 在區分大小寫的定序中檢查 URL 的所有其他區段 (
Latin1_General_100_BIN2)
- 使用不區分大小寫的定序檢查設定和主機 (
使用資料庫定序規則檢查 URL 和認證是否相符(且不執行任何 URL 編碼)。
管理式識別
若要在 SQL Server 2025 上使用受控識別進行驗證,您必須搭配sp_configure的用戶來啟用 選項。
EXECUTE sp_configure 'allow server scoped db credentials', 1;
RECONFIGURE WITH OVERRIDE;
SCHEMABINDING
若要卸除使用 SCHEMABINDING 建立 EXTERNAL MODEL 和參考的檢視 (例如 SELECT 使用 AI_GENERATE_EMBEDDINGS的陳述式),資料庫引擎會引發錯誤。 必須先修改或卸除檢視定義本身,才能移除參考的 EXTERNAL MODEL相依性。
目錄檢視
外部模型中繼資料可以透過查詢 sys.external_models 目錄檢視來檢視。 請注意,您必須能夠存取模型,才能檢視元數據。
SELECT *
FROM sys.external_models;
遠端端點的範例
使用受控識別建立具有 Azure OpenAI 的外部模型
此範例會使用 Azure OpenAI 建立類型的 EXTERNAL MODEL ,EMBEDDINGS並使用受控識別進行驗證。
這很重要
如果搭配 Azure OpenAI 和 SQL Server 2025 使用受控識別,則必須將 認知服務 OpenAI 參與者 角色授與 Azure Arc 所啟用的 SQL Server 系統指派受控識別。如需詳細資訊,請參閱 Azure AI Foundry 模型中 Azure OpenAI 的角色型存取控制。
-- Create access credentials to Azure OpenAI using a managed identity:
CREATE DATABASE SCOPED CREDENTIAL [https://my-azure-openai-endpoint.openai.azure.com/]
WITH IDENTITY = 'Managed Identity', secret = '{"resourceid":"https://cognitiveservices.azure.com"}';
GO
-- Create the EXTERNAL MODEL
CREATE EXTERNAL MODEL MyAzureOpenAiModel
AUTHORIZATION CRM_User
WITH (
LOCATION = 'https://my-azure-openai-endpoint.openai.azure.com/openai/deployments/text-embedding-ada-002/embeddings?api-version=2024-02-01',
API_FORMAT = 'Azure OpenAI',
MODEL_TYPE = EMBEDDINGS,
MODEL = 'text-embedding-ada-002',
CREDENTIAL = [https://my-azure-openai-endpoint.openai.azure.com/]
);
使用 API 金鑰和參數建立具有 Azure OpenAI 的外部模型
此範例會使用 Azure OpenAI 建立類型的 EXTERNAL MODEL ,EMBEDDINGS並使用 API 金鑰進行驗證。 此範例也用於 PARAMETERS 將端點的 dimensions 參數設定為 725。
-- Create access credentials to Azure OpenAI using a key:
CREATE DATABASE SCOPED CREDENTIAL [https://my-azure-openai-endpoint.openai.azure.com/]
WITH IDENTITY = 'HTTPEndpointHeaders', secret = '{"api-key":"YOUR_AZURE_OPENAI_KEY"}';
GO
-- Create the EXTERNAL MODEL
CREATE EXTERNAL MODEL MyAzureOpenAiModel
AUTHORIZATION CRM_User
WITH (
LOCATION = 'https://my-azure-openai-endpoint.openai.azure.com/openai/deployments/text-embedding-3-small/embeddings?api-version=2024-02-01',
API_FORMAT = 'Azure OpenAI',
MODEL_TYPE = EMBEDDINGS,
MODEL = 'text-embedding-3-small',
CREDENTIAL = [https://my-azure-openai-endpoint.openai.azure.com/],
PARAMETERS = '{"dimensions":725}'
);
使用 Ollama 和明確擁有者建立 EXTERNAL MODEL
此範例會 EXTERNAL MODEL 使用本機裝載的 Ollama 來建立 型別的 EMBEDDINGS ,以供開發之用。
CREATE EXTERNAL MODEL MyOllamaModel
AUTHORIZATION AI_User
WITH (
LOCATION = 'https://localhost:11435/api/embed',
API_FORMAT = 'Ollama',
MODEL_TYPE = EMBEDDINGS,
MODEL = 'all-minilm'
);
使用 OpenAI 建立 EXTERNAL MODEL
此範例會EXTERNAL MODELEMBEDDINGS使用 OpenAI API_FORMAT 和 HTTP 標頭型認證來建立 型別的 ,以進行驗證。
-- Create access credentials
CREATE DATABASE SCOPED CREDENTIAL [https://openai.com]
WITH IDENTITY = 'HTTPEndpointHeaders', secret = '{"Bearer":"YOUR_OPENAI_KEY"}';
GO
-- Create the external model
CREATE EXTERNAL MODEL MyAzureOpenAiModel
AUTHORIZATION CRM_User
WITH (
LOCATION = 'https://api.openai.com/v1/embeddings',
API_FORMAT = 'OpenAI',
MODEL_TYPE = EMBEDDINGS,
MODEL = 'text-embedding-ada-002',
CREDENTIAL = [https://openai.com]
);
本機 ONNX 執行階段的範例
此範例會引導您使用 ONNX 執行階段設定 SQL Server 2025,以啟用本機 AI 支援的文字內嵌產生。 它僅適用於 Windows。
ONNX Runtime 是一個開源推理引擎,可讓您在本機運行機器學習模型,使其成為將 AI 功能整合到 SQL Server 環境中的理想選擇。
這很重要
此功能需要安裝 SQL Server Machine Learning Services 。
步驟 1:在 SQL Server 2025 上啟用開發人員預覽功能
執行下列 SQL 命令,在您想要用於此範例的資料庫中啟用 SQL Server 2025 預覽功能:
ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
步驟 2:在 SQL Server 2025 上啟用本機 AI 執行階段
執行下列 SQL 來啟用外部 AI 執行階段:
EXECUTE sp_configure 'external AI runtimes enabled', 1;
RECONFIGURE WITH OVERRIDE;
步驟 3:設定 ONNX 執行階段程式庫
在 SQL Server 上建立目錄以保存 ONNX 執行階段程式庫檔案。 在此範例中,使用。 C:\onnx_runtime
您可以使用下列命令來建立目錄:
cd C:\
mkdir onnx_runtime
接下來, 下載 適合您作業系統的 ONNX Runtime (≥ 1.19 版)。 解壓縮下載後,將 (位於 lib 目錄中) 複製 onnxruntime.dll 到 C:\onnx_runtime 已建立的目錄。
步驟 4:設定代幣化庫
從 GitHub 下載並建置tokenizers-cpp程式庫。 建立 dll 後,將分詞器放在目錄中 C:\onnx_runtime 。
備註
確保創建的 dll 命名為 tokenizers_cpp.dll
步驟 5:下載 ONNX 模型
首先在 中model建立C:\onnx_runtime\目錄。
cd C:\onnx_runtime
mkdir model
此範例使用 all-MiniLM-L6-v2-onnx 模型,可從 Hugging Face 下載。
使用下列 C:\onnx_runtime\model 命令將存放庫複製到目錄中:
如果未安裝,您可以從以下 下載連結 或透過 winget (winget 安裝 Microsoft.Git) 下載 git
cd C:\onnx_runtime\model
git clone https://huggingface.co/nsense/all-MiniLM-L6-v2-onnx
步驟 6:設定目錄權限
使用下列 PowerShell 腳本,為 MSSQLLaunchpad 使用者提供 ONNX 執行階段目錄的存取權:
$AIExtPath = "C:\onnx_runtime";
$Acl = Get-Acl -Path $AIExtPath
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("MSSQLLaunchpad", "FullControl", "ContainerInherit,ObjectInherit", "None","Allow")
$Acl.AddAccessRule($AccessRule)
Set-Acl -Path $AIExtPath -AclObject $Acl
步驟 7:建立外部模型
執行下列 SQL 以將 ONNX 模型註冊為外部模型物件:
此處使用的「PARAMETERS」值是 SQL Server 2025(17.x)所需的佔位符。
CREATE EXTERNAL MODEL myLocalOnnxModel
WITH (
LOCATION = 'C:\onnx_runtime\model\all-MiniLM-L6-v2-onnx',
API_FORMAT = 'ONNX Runtime',
MODEL_TYPE = EMBEDDINGS,
MODEL = 'allMiniLM',
PARAMETERS = '{"valid":"JSON"}',
LOCAL_RUNTIME_PATH = 'C:\onnx_runtime\'
);
-
LOCATION應該指向包含model.onnx和tokenizer.json檔案的目錄。 -
LOCAL_RUNTIME_PATH應該指向包含onnxruntime.dll和tokenizer_cpp.dll的目錄。
步驟 8:產生內嵌
使用函 ai_generate_embeddings 式,透過執行下列 SQL 來測試模型:
SELECT AI_GENERATE_EMBEDDINGS(N'Test Text' USE MODEL myLocalOnnxModel);
此命令會 AIRuntimeHost啟動 ,載入所需的 DLL,並處理輸入文字。
SQL 語句的結果是嵌入陣列:
[0.320098,0.568766,0.154386,0.205526,-0.027379,-0.149689,-0.022946,-0.385856,-0.039183...]
啟用 XEvent 遙測
執行下列 SQL 以啟用遙測以進行疑難排解。
CREATE EVENT SESSION newevt
ON SERVER
ADD EVENT ai_generate_embeddings_airuntime_trace
(
ACTION (sqlserver.sql_text, sqlserver.session_id)
)
ADD TARGET package0.ring_buffer
WITH (MAX_MEMORY = 4096 KB, EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS, MAX_DISPATCH_LATENCY = 30 SECONDS, TRACK_CAUSALITY = ON, STARTUP_STATE = OFF);
GO
ALTER EVENT SESSION newevt ON SERVER STATE = START;
GO
接下來,使用此 SQL 查詢,查看擷取的遙測:
SELECT event_data.value('(@name)[1]', 'varchar(100)') AS event_name,
event_data.value('(@timestamp)[1]', 'datetime2') AS [timestamp],
event_data.value('(data[@name = "model_name"]/value)[1]', 'nvarchar(200)') AS model_name,
event_data.value('(data[@name = "phase_name"]/value)[1]', 'nvarchar(100)') AS phase,
event_data.value('(data[@name = "message"]/value)[1]', 'nvarchar(max)') AS message,
event_data.value('(data[@name = "request_id"]/value)[1]', 'nvarchar(max)') AS session_id,
event_data.value('(data[@name = "error_code"]/value)[1]', 'bigint') AS error_code
FROM (SELECT CAST (target_data AS XML) AS target_data
FROM sys.dm_xe_sessions AS s
INNER JOIN sys.dm_xe_session_targets AS t
ON s.address = t.event_session_address
WHERE s.name = 'newevt'
AND t.target_name = 'ring_buffer') AS data
CROSS APPLY target_data.nodes('//RingBufferTarget/event') AS XEvent(event_data);
收拾整理
若要移除外部模型物件,請執行下列 SQL:
DROP EXTERNAL MODEL myLocalOnnxModel;
若要移除目錄許可權,請執行下列 PowerShell 命令:
$Acl.RemoveAccessRule($AccessRule)
Set-Acl -Path $AIExtPath -AclObject $Acl
最後,刪除目錄 C:/onnx_runtime 。