次の方法で共有


sp_invoke_external_rest_endpoint (Transact-SQL)

適用対象:SQL Server 2025 (17.x) プレビュー Azure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric Preview の SQL データベース

sp_invoke_external_rest_endpoint ストアド プロシージャは、プロシージャへの入力引数として提供される HTTPS REST エンドポイントを呼び出します。

Note

sp_invoke_external_rest_endpoint ストアド プロシージャは、SQL Server 2025 (17.x) プレビューのプレビュー段階にあります。

不正アクセスやデータ転送のリスクを軽減する方法

Caution

sp_invoke_external_rest_endpoint ストアド プロシージャを使用すると、外部エンティティにデータを転送できます。

不正アクセスやデータ転送のリスクを軽減するには、次のセキュリティのベスト プラクティスを検討してください。

  • 強力なアクセス制御を実装: 承認されたユーザーのみが機密データと REST API エンドポイントにアクセスできるようにします。 最小限の特権 原則と、データベース ロールと特権を使用します。
  • 適切な認証と承認の: すべての REST 呼び出しが認証され、承認されていないことを確認して、未承認のアクセスを防ぎます。
  • アクセスの監視と監査: データベースと REST API 呼び出しへのアクセスを定期的に監視および監査して、疑わしいアクティビティを検出します。
  • 定期的なセキュリティ評価: 潜在的なリスクを特定して軽減するために、定期的なセキュリティ評価と脆弱性スキャンを実施します。
  • 従業員のトレーニング: データ流出のリスクと、セキュリティ プロトコルに従うことの重要性について従業員を教育します。

Syntax

Transact-SQL 構文表記規則

EXECUTE @returnValue = sp_invoke_external_rest_endpoint
  [ @url = ] N'url'
  [ , [ @payload = ] N'request_payload' ]
  [ , [ @headers = ] N'http_headers_as_json_array' ]
  [ , [ @method = ] 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' ]
  [ , [ @timeout = ] seconds ]
  [ , [ @credential = ] credential ]
  [ , @response OUTPUT ]

Arguments

[ @url = ] N'url'

呼び出される HTTPS REST エンドポイントの URL。 @url は既定値なしで nvarchar(4000) です。

[ @payload = ] N'request_payload'

HTTPS REST エンドポイントに送信するペイロードを含む JSON、XML、または TEXT 形式の Unicode 文字列。 ペイロードは、有効な JSON ドキュメント、整形式の XML ドキュメント、またはテキストである必要があります。 @payload は既定値なしで nvarchar(max) です。

[ @headers = ] N'headers'

要求の一部として HTTPS REST エンドポイントに送信する必要があるヘッダー。 ヘッダーは、フラット JSON (入れ子構造のない JSON ドキュメント) 形式を使用して指定する必要があります。 許可 されていないヘッダー名 リストで定義されているヘッダーは、 @headers パラメーターで明示的に渡された場合でも無視されます。これらの値は、HTTPS 要求の開始時に破棄されるか、システム指定の値に置き換えられます。

@headers パラメーターは、既定値のない nvarchar(4000)です。

[ @method = ] N'method'

URL を呼び出すための HTTP メソッド。 GETPOSTPUTPATCHDELETEHEADのいずれかの値を指定する必要があります。 @methodは既定値としてPOSTです。

[ @timeout = ]

HTTPS 呼び出しを実行できる時間 (秒単位)。 定義されたタイムアウト時間内に完全な HTTP 要求と応答を送信および受信できない場合は、ストアド プロシージャの実行が停止され、例外が発生します。 タイムアウトは、HTTP 接続が開始されたときに開始され、応答とペイロード (含まれている場合) が受信されたときに終了します。 @timeout は、既定値が 30 の正の smallint です。 指定できる値: 1 ~ 230。

[ @credential = ] 資格情報

HTTPS 要求に認証情報を挿入するために使用される DATABASE SCOPED CREDENTIAL オブジェクトを指定します。 @credential は既定値のない sysname です。

@response アウトプット

呼び出されたエンドポイントから受信した応答を、指定された変数に渡すことを許可します。 @responsenvarchar(max)です。

Return value

HTTPS 呼び出しが実行され、受信した HTTP 状態コードが 2xx 状態コード (0) の場合、実行はSuccessを返します。 受信した HTTP 状態コードが 2xx の範囲にない場合、戻り値は受信した HTTP 状態コードです。 HTTPS 呼び出しをまったく実行できない場合は、例外がスローされます。

Permissions

Database permissions

EXECUTE ANY EXTERNAL ENDPOINT データベース権限が必要です。

For example:

GRANT EXECUTE ANY EXTERNAL ENDPOINT TO [<PRINCIPAL>];

SQL Server 2025 と Azure SQL Managed Instance で有効にする

Note

sp_invoke_external_rest_endpoint ストアド プロシージャは、SQL Server 2025 (17.x) プレビューのプレビュー段階にあります。

sp_invoke_external_rest_endpoint ストアド プロシージャは、SQL Server 2025 (17.x) プレビューおよび Always-up-to-date 更新ポリシーで構成された Azure SQL Managed Instance で使用でき、既定では無効になっています。

SQL Server 2025 (17.x) Preview と Azure SQL Managed Instance で sp_invoke_external_rest_endpoint ストアド プロシージャを有効にするには、次の T-SQL コードを実行します。

EXECUTE sp_configure 'external rest endpoint enabled', 1;

RECONFIGURE WITH OVERRIDE;

sp_configureを実行して構成オプションを変更したり、RECONFIGURE ステートメントを実行したりするには、ALTER SETTINGS サーバー レベルのアクセス許可をユーザーに付与する必要があります。 ALTER SETTINGS 権限は、sysadmin 固定サーバー ロールと serveradmin 固定 サーバー ロールによって暗黙的に保持されます。

Note

sp_invoke_external_rest_endpoint は、Azure SQL Database と Fabric の SQL データベースで既定で有効になっています。

Response format

HTTP 呼び出しの応答と、呼び出されたエンドポイントによって返される結果のデータは、 @response 出力パラメーターを使用して使用できます。 @response には、次のスキーマを持つ JSON ドキュメントが含まれている場合があります。

{
  "response": {
    "status": {
      "http": {
        "code": "",
        "description": ""
      }
    },
    "headers": {}
  },
  "result": {}
}

Specifically:

  • response: HTTP 結果とその他の応答メタデータを含む JSON オブジェクト。
  • result: HTTP 呼び出しによって返される JSON ペイロード。 受信した HTTP 結果が 204 (No Content) の場合は省略されます。

または、 @response に次のスキーマを持つ XML ドキュメントが含まれている場合があります。

<output>
    <response>
        <status>
            <http code="" description=" " />
        </status>
        <headers>
            <header key="" value="" />
            <header key="" value="" />
        </headers>
    </response>
    <result>
    </result>
</output>

Specifically:

  • response: HTTP 結果とその他の応答メタデータを含む XML オブジェクト。
  • result: HTTP 呼び出しによって返される XML ペイロード。 受信した HTTP 結果が 204 (No Content) の場合は省略されます。

responseセクションでは、HTTP 状態コードと説明とは別に、受信した応答ヘッダーのセット全体が headers オブジェクトに表示されます。 次の例は、JSON の response セクションを示しています (テキスト応答の構造も示しています)。

"response": {
  "status": {
    "http": {
      "code": 200,
      "description": "OK"
    }
  },
  "headers": {
    "Date": "Thu, 08 Sep 2022 21:51:22 GMT",
    "Content-Length": "1345",
    "Content-Type": "application\/json; charset=utf-8",
    "Server": "Kestrel",
    "Strict-Transport-Security": "max-age=31536000; includeSubDomains"
    }
  }

次の例は、XML の response セクションを示しています。

<response>
    <status>
        <http code="200" description="OK" />
    </status>
    <headers>
        <header key="Date" value="Tue, 01 Apr 1976 21:12:04 GMT" />
        <header key="Content-Length" value="2112" />
        <header key="Content-Type" value="application/xml" />
        <header key="Server" value="Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" />
        <header key="x-ms-request-id" value="31536000-64bi-64bi-64bi-31536000" />
        <header key="x-ms-version" value="2021-10-04" />
        <header key="x-ms-creation-time" value="Wed, 19 Apr 2023 22:17:33 GMT" />
        <header key="x-ms-server-encrypted" value="true" />
    </headers>
</response>

Allowed endpoints

Important

この一覧は、Azure SQL Database と Azure SQL Managed Instance にのみ適用されます。

次のサービスのエンドポイントへの呼び出しのみが許可されます。

Azure Service Domain
Azure Functions *.azurewebsites.net
Azure アプリ サービス *.azurewebsites.net
Azure App Service Environment *.appserviceenvironment.net
Azure Static Web Apps *.azurestaticapps.net
Azure Logic Apps *.logic.azure.com
Azure Event Hubs *.servicebus.windows.net
Azure Event Grid *.eventgrid.azure.net
Azure AI サービス *.cognitiveservices.azure.com
*.api.cognitive.microsoft.com
Azure OpenAI *.openai.azure.com
PowerApps/Dataverse *.api.crm.dynamics.com
Microsoft Dynamics *.dynamics.com
Azure Container Instances *.azurecontainer.io
Azure Container Apps *.azurecontainerapps.io
Power BI api.powerbi.com
Microsoft Graph graph.microsoft.com
Analysis Services *.asazure.windows.net
IoT Central *.azureiotcentral.com
API Management *.azure-api.net
Azure Blob Storage *.blob.core.windows.net
Azure Files *.file.core.windows.net
Azure Queue Storage *.queue.core.windows.net
Azure Table Storage(アジュール テーブル ストレージ) *.table.core.windows.net
Azure Communication Services *.communications.azure.com
Bing 検索 api.bing.microsoft.com
Azure Key Vault *.vault.azure.net
Azure AI 検索 *.search.windows.net
Azure Maps *.atlas.microsoft.com
Azure AI 翻訳 api.cognitive.microsofttranslator.com

Azure SQL Database と Azure Synapse Analytics の送信ファイアウォール規則 制御メカニズムを使用して、外部エンドポイントへの送信アクセスをさらに制限できます。

Note

許可リスト内にない REST サービスを呼び出す場合は、API Management を使用して目的のサービスを安全に公開し、 sp_invoke_external_rest_endpointで使用できるようにします。

Limits

Payload size

ペイロードは、受信時と送信時の両方で、ネットワーク経由で送信されるときに UTF-8 エンコードされます。 この形式では、サイズは 100 MB に制限されます。

URL length

最大 URL 長 ( @url パラメーターを使用し、指定した資格情報がある場合はクエリ文字列に追加した後に生成されます) は 8 KB です。クエリ文字列の最大長 (クエリ文字列 + 資格情報クエリ文字列) は 4 KB です。

Headers size

要求ヘッダーと応答ヘッダーの最大サイズ (すべてのヘッダー フィールド: @headers パラメーターを介して渡されたヘッダー + 資格情報ヘッダー + システム提供のヘッダー) は 8 KB です。

Throttling

sp_invoke_external_rest_endpoint経由で行われる外部エンドポイントへの同時接続の数は、ワーカー スレッドの 10% に制限され、最大 150 個のワーカーが含まれます。 single データベースでは調整はデータベース レベルで適用されますが、エラスティック プールでは調整はデータベース レベルとプール レベルの両方で適用されます。

データベースが維持できるコンカレント接続の数を確認するには、次のクエリを実行します。

SELECT [database_name],
       DATABASEPROPERTYEX(DB_NAME(), 'ServiceObjective') AS service_level_objective,
       [slo_name] AS service_level_objective_long,
       [primary_group_max_outbound_connection_workers] AS max_database_outbound_connection,
       [primary_pool_max_outbound_connection_workers] AS max_pool_outbound_connection
FROM sys.dm_user_db_resource_governance
WHERE database_id = DB_ID();

最大同時接続数に既に達したときに、 sp_invoke_external_rest_endpoint を使用して外部エンドポイントへの新しい接続が試行された場合は、エラー 10928 (エラスティック プールの制限に達した場合は 10936) が発生します。 For example:

Msg 10928, Level 16, State 4, Procedure sys.sp_invoke_external_rest_endpoint_internal, Line 1 [Batch Start Line 0]
Resource ID : 1. The outbound connections limit for the database is 20 and has been reached.
See 'https://docs.microsoft.com/azure/azure-sql/database/resource-limits-logical-server' for assistance.

Credentials

一部の REST エンドポイントでは、適切に呼び出されるために認証が必要です。 通常、認証は、クエリ文字列または要求で設定された HTTP ヘッダーに特定のキーと値のペアを渡すことによって行うことができます。

DATABASE SCOPED CREDENTIALを使用して、保護されたエンドポイントを呼び出すためにsp_invoke_external_rest_endpointによって使用される認証データ (ベアラー トークンなど) を安全に格納できます。 DATABASE SCOPED CREDENTIALを作成するときは、IDENTITY パラメーターを使用して、呼び出されたエンドポイントに渡される認証データとその方法を指定します。 IDENTITY では、次の 4 つのオプションがサポートされています。

  • HTTPEndpointHeaders: Request ヘッダーを使用して、指定された認証データを送信します
  • HTTPEndpointQueryString: Query 文字列を使用して指定された認証データを送信します
  • Managed Identity: 要求ヘッダーを使用して、システム割り当て 管理 ID を送信します
  • Shared Access Signature: 署名された URL を使用してリソースへの制限付き委任アクセスを提供します (SAS とも呼ばれます)

作成された DATABASE SCOPED CREDENTIAL は、 @credential パラメーターを使用して使用できます。

EXECUTE sp_invoke_external_rest_endpoint
    @url = N'https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>?key1=value1',
    @credential = [https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>];

この IDENTITY 値を使用すると、 DATABASE SCOPED CREDENTIAL が要求ヘッダーに追加されます。 認証情報を含むキーと値のペアは、フラット JSON 形式を使用して SECRET パラメーターを使用して指定する必要があります。 For example:

CREATE DATABASE SCOPED CREDENTIAL [https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>]
WITH IDENTITY = 'HTTPEndpointHeaders', SECRET = '{"x-functions-key":"<your-function-key-here>"}';

資格情報名の規則

作成された DATABASE SCOPED CREDENTIAL は、 sp_invoke_external_rest_endpointで使用するために特定の規則に従う必要があります。 規則は次のとおりです。

  • 有効な URI である必要があります。
  • URL ドメインは、許可リストに含まれているドメインのいずれかである必要があります
  • URL にクエリ文字列を含めてはなりません
  • 呼び出された URL のプロトコル + 完全修飾ドメイン名 (FQDN) は、資格情報名のプロトコル + FQDN と一致している必要があります
  • 呼び出された URL パスの各部分は、資格情報名の URL パスのそれぞれの部分と完全に一致する必要があります
  • 資格情報は、要求 URL よりも汎用的なパスを指す必要があります。 たとえば、パス https://northwind.azurewebsite.net/customers 用に作成された資格情報を URL に使用することはできません https://northwind.azurewebsite.net

照合順序と資格情報名の規則

RFC 3986 セクション 6.2.2.1 では、「URI がジェネリック構文のコンポーネントを使用する場合、コンポーネント構文の等価性ルールが常に適用されます。つまり、スキームとホストでは大文字と小文字が区別されません」と RFC 7230 セクション 2.7.3 では、"その他はすべて大文字と小文字が区別される方法で比較されます" と記載されています。

データベース レベルで照合順序規則が設定されているため、次のロジックが適用され、データベースの照合順序規則と前述の RFC と一貫性があります。 (たとえば、データベースが大文字と小文字を区別する照合順序を使用するように設定されている場合など、記述された規則は RFC 規則よりも制限が厳しい可能性があります)。

  1. RFC を使用して URL と資格情報が一致するかどうかを確認します。これは次のことを意味します。
    • 大文字と小文字を区別しない照合順序を使用してスキームとホストを確認する (Latin1_General_100_CI_AS_KS_WS_SC)
    • 大文字と小文字を区別する照合順序で URL の他のすべてのセグメントが比較されていることを確認する (Latin1_General_100_BIN2)
  2. URL と資格情報がデータベースの照合順序規則を使用して一致することを確認します (URL エンコードは行いません)。

資格情報を使用するためのアクセス許可を付与する

DATABASE SCOPED CREDENTIAL にアクセスするデータベース ユーザーには、その資格情報を使用するためのアクセス許可が必要です。

資格情報を使用するには、データベース ユーザーが特定の資格情報 REFERENCES アクセス許可を持っている必要があります。

GRANT REFERENCES ON DATABASE SCOPED CREDENTIAL::[<CREDENTIAL_NAME>] TO [<PRINCIPAL>];

Remarks

Wait type

呼び出されたサービスへの呼び出しが完了するのを待機している sp_invoke_external_rest_endpoint は、 HTTP_EXTERNAL_CONNECTION 待機の種類を報告します。

HTTPS と TLS

TLS 暗号化プロトコルで HTTPS を使用するように構成されているエンドポイントのみがサポートされます。

HTTP redirects

sp_invoke_external_rest_endpoint は、呼び出されたエンドポイントからの応答として受信された HTTP リダイレクトに自動的には従いません。

HTTP headers

sp_invoke_external_rest_endpoint は、HTTP 要求に次のヘッダーを自動的に挿入します。

  • content-type: application/json; charset=utf-8
  • accept: application/json
  • user-agent: 次に例を示 <EDITION>/<PRODUCT VERSION> 設定します。 SQL Azure/12.0.2000.8

ユーザー エージェントは常にストアド プロシージャによって上書きされますが、コンテンツ タイプ受け入れヘッダー値は、@headers パラメーターを使用してユーザー定義できます。 コンテンツ タイプで指定できるのはメディア タイプ ディレクティブのみであり、文字セットまたは境界ディレクティブを指定することはできません。

要求と応答のペイロードでサポートされている メディアの種類

ヘッダー content-type に使用できる値を次に示します。

  • application/json
  • application/vnd.microsoft.*.json
  • application/xml
  • application/vnd.microsoft.*.xml
  • application/vnd.microsoft.*+xml
  • application/x-www-form-urlencoded
  • text/*

accept ヘッダーでは、次の値を使用できます。

  • application/json
  • application/xml
  • text/*

テキスト ヘッダーの種類の詳細については、IANA の テキスト型レジストリを参照してください。

Note

他のツール (cURLInsomnia などの最新の REST クライアントなど) を使用して REST エンドポイントの呼び出しをテストする場合はsp_invoke_external_rest_endpointによって自動的に挿入されるのと同じヘッダーを含めて、同じ動作と結果を得るようにしてください。

Best practices

バッチ処理手法を使用する

Azure 関数やイベント ハブなど、一連の行を REST エンドポイントに送信する必要がある場合は、送信される各行の HTTPS 呼び出しのオーバーヘッドを回避するために、行を 1 つの JSON ドキュメントにバッチ処理することをお勧めします。 これを行うには、 FOR JSON ステートメントを使用します。次に例を示します。

-- create the payload
DECLARE @payload AS NVARCHAR (MAX);

SET @payload = (SELECT [object_id],
                       [name],
                       [column_id]
                FROM sys.columns
                FOR JSON AUTO);

-- invoke the REST endpoint
DECLARE @retcode AS INT, @response AS NVARCHAR (MAX);

EXECUTE
    @retcode = sp_invoke_external_rest_endpoint
    @url = '<REST_endpoint>',
    @payload = @payload,
    @response = @response OUTPUT;

-- return the result
SELECT @retcode,
       @response;

Examples

ここでは、 sp_invoke_external_rest_endpoint を使用して、Azure Functions や Azure Event Hubs などの一般的な Azure サービスと統合する方法の例をいくつか紹介します。 他のサービスと統合するためのその他のサンプルについては、 GitHubを参照してください。

A. 認証なしで HTTP トリガー バインドを使用して Azure 関数を呼び出す

次の例では、匿名アクセスを許可する HTTP トリガー バインドを使用して Azure 関数を呼び出します。

DECLARE @ret AS INT, @response AS NVARCHAR (MAX);

EXECUTE
    @ret = sp_invoke_external_rest_endpoint
    @url = N'https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>?key1=value1',
    @headers = N'{"header1":"value_a", "header2":"value2", "header1":"value_b"}',
    @payload = N'{"some":{"data":"here"}}',
    @response = @response OUTPUT;

SELECT @ret AS ReturnCode,
       @response AS Response;

B. 承認キーを使用して HTTP トリガー バインドを使用して Azure 関数を呼び出す

次の例では、承認キーを必要とするように構成された HTTP トリガー バインドを使用して Azure 関数を呼び出します。 承認キーは、Azure Functions で必要に応じて x-function-key ヘッダーで渡されます。 詳細については、「 Azure Functions - API キーの承認」を参照してください。

CREATE DATABASE SCOPED CREDENTIAL [https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>]
    WITH IDENTITY = 'HTTPEndpointHeaders', SECRET = '{"x-functions-key":"<your-function-key-here>"}';

DECLARE @ret AS INT, @response AS NVARCHAR (MAX);

EXECUTE
    @ret = sp_invoke_external_rest_endpoint
    @url = N'https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>?key1=value1',
    @headers = N'{"header1":"value_a", "header2":"value2", "header1":"value_b"}',
    @credential = [https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>],
    @payload = N'{"some":{"data":"here"}}',
    @response = @response OUTPUT;

SELECT @ret AS ReturnCode,
       @response AS Response;

C. SAS トークンを使用して Azure Blob Storage からファイルの内容を読み取る

この例では、認証に SAS トークンを使用して Azure Blob Storage からファイルを読み取ります。 結果は XML で返されるため、ヘッダー "Accept":"application/xml"を使用する必要があります。

DECLARE @ret AS INT, @response AS NVARCHAR (MAX);

EXECUTE
    @ret = sp_invoke_external_rest_endpoint
    @url = N'https://blobby.blob.core.windows.net/datafiles/my_favorite_blobs.txt?sp=r&st=2023-07-28T19:56:07Z&se=2023-07-29T03:56:07Z&spr=https&sv=2022-11-02&sr=b&sig=XXXXXX1234XXXXXX6789XXXXX',
    @headers = N'{"Accept":"application/xml"}',
    @method = 'GET',
    @response = @response OUTPUT;

SELECT @ret AS ReturnCode,
       @response AS Response;

D. Azure SQL Database マネージド ID を使用してイベント ハブにメッセージを送信する

このサンプルでは、Azure SQL マネージド ID を使用して Event Hubs にメッセージを送信する方法を示します。 データベースをホストする Azure SQL Database 論理サーバーの System Managed Identity が構成されていることを確認します。次に例を示します。

az sql server update -g <resource-group> -n <azure-sql-server> --identity-type SystemAssigned

その後、Azure SQL Server のマネージド ID が目的のイベント ハブにメッセージ ("Azure Event Hubs Data Sender" ロール) を送信できるように Event Hubs を構成します。 詳細については、「 マネージド ID で Event Hubs を使用する」を参照してください。

これが完了したら、Managed Identityによって使用されるデータベース スコープの資格情報を定義するときに、sp_invoke_external_rest_endpoint ID 名を使用できます。 で説明されているように、Event Hubs リソースにアクセスするために Microsoft Entra ID を持つアプリケーションを認証します、Microsoft Entra 認証を使用するときに使用するリソース名 (または ID) はhttps://eventhubs.azure.net

CREATE DATABASE SCOPED CREDENTIAL [https://<EVENT-HUBS-NAME>.servicebus.windows.net]
WITH IDENTITY = 'Managed Identity', SECRET = '{"resourceid": "https://eventhubs.azure.net"}';
GO

DECLARE @Id AS UNIQUEIDENTIFIER = NEWID();

DECLARE @payload AS NVARCHAR (MAX) = (SELECT *
    FROM (VALUES (@Id, 'John', 'Doe')) AS UserTable(UserId, FirstName, LastName)
    FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER);

DECLARE @url AS NVARCHAR (4000) = 'https://<EVENT-HUBS-NAME>.servicebus.windows.net/from-sql/messages';

DECLARE @headers AS NVARCHAR (4000) = N'{"BrokerProperties": "'
    + STRING_ESCAPE('{"PartitionKey": "'
    + CAST (@Id AS NVARCHAR (36)) + '"}', 'json') + '"}';

DECLARE @ret AS INT, @response AS NVARCHAR (MAX);

EXECUTE
    @ret = sp_invoke_external_rest_endpoint
    @url = @url,
    @headers = @headers,
    @credential = [https://<EVENT-HUBS-NAME>.servicebus.windows.net],
    @payload = @payload,
    @response = @response OUTPUT;

SELECT @ret AS ReturnCode,
       @response AS Response;

E. Azure SQL Database スコープの資格情報を使用して Azure File Storage に対するファイルの読み取りと書き込みを行う

この例では、認証用に Azure SQL Database スコープの資格情報を使用して Azure File Storage にファイルを書き込み、その内容を返します。 結果は XML で返されるため、ヘッダー "Accept":"application/xml"を使用する必要があります。

まず、Azure SQL データベースのマスター キーを作成します。 <password>を強力なパスワードに置き換えます。

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
GO

次に、Azure Blob Storage アカウントによって提供される SAS トークンを使用して、データベース スコープの資格情報を作成します。 <token>を指定された SAS トークンに置き換えます。

CREATE DATABASE SCOPED CREDENTIAL [filestore]
WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<token>';
GO

次に、ファイルを作成し、次の 2 つのステートメントでテキストを追加します。 <domain>を適切なパスに置き換えます。

DECLARE @payload AS NVARCHAR (MAX) = (SELECT *
    FROM (VALUES ('Hello from Azure SQL!', sysdatetime())) AS payload([message], [timestamp])
    FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER);

DECLARE @response AS NVARCHAR (MAX);
DECLARE @url AS NVARCHAR (MAX);
DECLARE @headers AS NVARCHAR (1000);

DECLARE @len AS INT = len(@payload);

-- Create the file
SET @url = 'https://<domain>.file.core.windows.net/myfiles/test-me-from-azure-sql.json';
SET @headers = JSON_OBJECT('x-ms-type':'file', 'x-ms-content-length':CAST (@len AS VARCHAR (9)), 'Accept':'application/xml');

EXECUTE sp_invoke_external_rest_endpoint
    @url = @url,
    @method = 'PUT',
    @headers = @headers,
    @credential = [filestore],
    @response = @response OUTPUT;

SELECT CAST (@response AS XML);

-- Add text to the file
SET @headers = JSON_OBJECT('x-ms-range':'bytes=0-' + CAST (@len - 1 AS VARCHAR (9)), 'x-ms-write':'update', 'Accept':'application/xml');
SET @url = 'https://<domain>.file.core.windows.net/myfiles/test-me-from-azure-sql.json';
SET @url += '?comp=range';

EXECUTE sp_invoke_external_rest_endpoint
    @url = @url,
    @method = 'PUT',
    @headers = @headers,
    @payload = @payload,
    @credential = [filestore],
    @response = @response OUTPUT;

SELECT CAST (@response AS XML);
GO

最後に、次のステートメントを使用してファイルを読み取る。 <domain>を適切なパスに置き換えます。

DECLARE @response AS NVARCHAR (MAX);

DECLARE @url AS NVARCHAR (MAX) = 'https://<domain>.file.core.windows.net/myfiles/test-me-from-azure-sql.json';

EXECUTE sp_invoke_external_rest_endpoint
    @url = @url,
    @headers = '{"Accept":"application/xml"}',
    @credential = [filestore],
    @method = 'GET',
    @response = @response OUTPUT;

SELECT CAST (@response AS XML);
GO

F. マネージド ID を使用して Azure OpenAI を呼び出す

次の例では、 Microsoft Entra for Azure SQL のマネージド ID を使用して Azure OpenAI モデルを呼び出します。 <my-azure-openai-endpoint><model-deployment-name>をそれぞれ Azure OpenAI エンドポイントとモデル名に置き換え、マネージド ID に Azure OpenAI サービスの Cognitive Services OpenAI ユーザー ロールが付与されていることを確認します。

CREATE DATABASE SCOPED CREDENTIAL [https://<my-azure-openai-endpoint>.openai.azure.com]
    WITH IDENTITY = 'Managed Identity', SECRET = '{"resourceid":"https://cognitiveservices.azure.com"}';
GO

DECLARE @response AS NVARCHAR (MAX);

DECLARE @payload AS NVARCHAR (MAX) = JSON_OBJECT('input':'hello world');

EXECUTE sp_invoke_external_rest_endpoint
    @url = 'https://<my-azure-openai-endpoint>.openai.azure.com/openai/deployments/<model-deployment-name>/embeddings?api-version=2024-08-01-preview',
    @method = 'POST',
    @credential = [https://<my-azure-openai-endpoint>.openai.azure.com],
    @payload = @payload,
    @response = @response OUTPUT;

SELECT json_query(@response, '$.result.data[0].embedding'); -- Assuming the called model is an embedding model