Поделиться через


sp_invoke_external_rest_endpoint (Transact-SQL)

Применимо к: SQL Server 2025 (17.x) — предварительная версия базы данных SQLAzure Для Управляемого экземпляра SQL Azureв Microsoft Fabric

Хранимая sp_invoke_external_rest_endpoint процедура вызывает конечную точку REST HTTPS, предоставленную в качестве входного аргумента для процедуры.

Примечание.

Хранимая sp_invoke_external_rest_endpoint процедура доступна в предварительной версии для ПРЕДВАРИТЕЛЬНОй версии SQL Server 2025 (17.x).

Способы устранения риска несанкционированного доступа или передачи данных

Осторожность

Использование хранимой процедуры sp_invoke_external_rest_endpoint позволяет передавать данные во внешнюю сущность.

Чтобы снизить риск несанкционированного доступа или передачи данных, рассмотрите следующие рекомендации по обеспечению безопасности:

  • Реализовать строгие средства управления доступом. Убедитесь, что только авторизованные пользователи имеют доступ к конфиденциальным данным и конечным точкам REST API. Используйте принцип наименьших привилегий, а также роли и привилегии базы данных.
  • Правильная проверка подлинности и авторизация. Убедитесь, что все вызовы REST проходят проверку подлинности и авторизованы для предотвращения несанкционированного доступа.
  • Мониторинг и аудит доступа: регулярно отслеживайте и проверяйте доступ к базе данных и вызовы REST API для обнаружения подозрительных действий.
  • регулярные оценки безопасности. Проводите регулярные оценки безопасности и проверки уязвимостей для выявления и устранения потенциальных рисков.
  • обучение сотрудников: обучать сотрудников о рисках кражи данных и важности следующих протоколов безопасности.

Синтаксис

Соглашения о синтаксисе 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 ]

Аргументы

[ @url = ] N'url'

URL-адрес вызываемой конечной точки REST HTTPS. @url — nvarchar(4000) без значения по умолчанию.

[ @payload = ] N'request_payload'

Строка Юникода в формате JSON, XML или TEXT, содержащая полезные данные для отправки в конечную точку REST HTTPS. Полезные данные должны быть допустимым документом JSON, хорошо сформированным XML-документом или текстом. @payload — nvarchar(max) без значения по умолчанию.

[ @headers = ] N'headers'

Заголовки, которые должны быть отправлены в рамках запроса в конечную точку REST HTTPS. Заголовки должны быть указаны с помощью неструктурированного формата JSON (документа JSON без вложенных структур). Заголовки, определенные в списке имен запрещенных заголовков , игнорируются, даже если явно переданы в параметре @headers ; их значения удаляются или заменяются системными значениями при запуске HTTPS-запроса.

Параметр @headersnvarchar(4000) без значения по умолчанию.

[ @method = ] N'method'

Метод HTTP для вызова URL-адреса. Должно быть одним из следующих значений: GET, POST, PUT, PATCH, DELETE. HEAD @method — nvarchar(6) с POST значением по умолчанию.

[ @timeout = ] секунды

Время в секундах, разрешено для выполнения вызова HTTPS. Если полный HTTP-запрос и ответ не могут быть отправлены и получены в течение определенного времени ожидания в секундах, выполнение хранимой процедуры прекращается, и возникает исключение. Время ожидания начинается, когда http-подключение начинается и заканчивается, когда ответ, и полезные данные, включенные, если таковые имеются, были получены. @timeout является положительным небольшим значением по умолчанию 30. Принятые значения: от 1 до 230.

[ @credential = ] учетные данные

Укажите, какой объект DATABASE SCOPED CREDENTIAL используется для внедрения сведений о проверке подлинности в HTTPS-запросе. @credential — sysname без значения по умолчанию.

@response ВЫПУСК

Разрешите ответ, полученный от вызываемой конечной точки, передаваться в указанную переменную. @response — nvarchar(max).

Возвращаемое значение

Выполнение возвращается 0 , если был выполнен вызов HTTPS, а полученный код состояния HTTP — это код состояния 2xx (Success). Если полученный код состояния HTTP не находится в диапазоне 2xx, возвращаемое значение является полученным кодом состояния HTTP. Если вызов HTTPS не может быть выполнен вообще, создается исключение.

Разрешения

Разрешения базы данных

Требуется разрешение БАЗЫ данных EXECUTE ANY EXTERNAL ENDPOINT.

Например:

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

Включение в SQL Server 2025 и Управляемом экземпляре SQL Azure

Примечание.

Хранимая sp_invoke_external_rest_endpoint процедура доступна в предварительной версии для ПРЕДВАРИТЕЛЬНОй версии SQL Server 2025 (17.x).

Хранимая sp_invoke_external_rest_endpoint процедура доступна в предварительной версии SQL Server 2025 (17.x) и Управляемом экземпляре SQL Azure, настроенном с помощью политики обновления Always-up-to-date и отключена по умолчанию.

Чтобы включить хранимую процедуру в ПРЕДВАРИТЕЛЬНОй sp_invoke_external_rest_endpoint версии SQL Server 2025 (17.x) и Управляемом экземпляре SQL Azure, выполните следующий код T-SQL:

EXECUTE sp_configure 'external rest endpoint enabled', 1;

RECONFIGURE WITH OVERRIDE;

Чтобы выполнить sp_configure изменение параметра конфигурации или запустить инструкцию RECONFIGURE , пользователю необходимо предоставить разрешение НА уровне сервера ALTER SETTINGS. Разрешение ALTER SETTINGS неявно хранится ролями сервера sysadmin и serveradmin.

Примечание.

sp_invoke_external_rest_endpoint включен по умолчанию в Базе данных SQL Azure и базе данных SQL в Fabric.

Формат ответа

Ответ на HTTP-вызов и полученные данные, отправляемые вызываемой конечной точкой, доступны через параметр вывода @response . @response может содержать документ JSON со следующей схемой:

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

В частности:

  • ответ: объект JSON, содержащий результат HTTP и другие метаданные ответа.
  • результат: полезные данные JSON, возвращаемые вызовом HTTP. Опущен, если полученный результат 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>

В частности:

  • ответ: XML-объект, содержащий результат HTTP и другие метаданные ответа.
  • результат: полезные данные XML, возвращаемые вызовом HTTP. Опущен, если полученный результат HTTP равен 204 (No Content).

response В разделе, помимо кода состояния HTTP и описания, весь набор заголовков полученных ответов предоставляется в объектеheaders. В следующем примере показан response раздел в ФОРМАТЕ JSON (также структура для текстовых ответов):

"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"
    }
  }

В следующем примере показан response раздел в ФОРМАТЕ XML:

<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>

Разрешенные конечные точки

Это важно

Этот список относится только к Базе данных SQL Azure и Управляемому экземпляру SQL Azure.

Разрешены только вызовы конечных точек для следующих служб:

Служба Azure Домен
Функции Azure *.azurewebsites.net
Служба приложение Azure *.azurewebsites.net
Среда службы приложений Azure *.appserviceenvironment.net
Служба статических веб-приложений Azure *.azurestaticapps.net
Приложения логики Azure *.logic.azure.com
Центры событий Azure *.servicebus.windows.net
Сетку событий Azure *.eventgrid.azure.net
Службы искусственного интеллекта Azure *.cognitiveservices.azure.com
*.api.cognitive.microsoft.com
Azure OpenAI *.openai.azure.com
PowerApps / Dataverse *.api.crm.dynamics.com
Microsoft Dynamics *.dynamics.com
Экземпляры контейнеров Azure *.azurecontainer.io
Приложения-контейнеры Azure *.azurecontainerapps.io
Power BI api.powerbi.com
Microsoft Graph graph.microsoft.com
Службы Analysis Services *.asazure.windows.net
Центр Интернета вещей *.azureiotcentral.com
Управление API *.azure-api.net
Хранилище BLOB-объектов Azure *.blob.core.windows.net
Файлы Azure *.file.core.windows.net
Хранилище очередей Azure *.queue.core.windows.net
Хранилище таблиц Azure *.table.core.windows.net
Службы коммуникации Azure *.communications.azure.com
Поиск Bing api.bing.microsoft.com
Azure Key Vault *.vault.azure.net
Поиск с использованием ИИ Azure *.search.windows.net
Azure Maps *.atlas.microsoft.com
Переводчик Azure AI api.cognitive.microsofttranslator.com

Правила исходящего брандмауэра для База данных SQL Azure и механизма управления Azure Synapse Analytics можно использовать для дальнейшего ограничения исходящего доступа к внешним конечным точкам.

Примечание.

Если вы хотите вызвать службу REST, которая не указана в списке разрешенных, можно использовать Управление API для безопасного предоставления требуемой службы и его доступностиsp_invoke_external_rest_endpoint.

Ограничения

Размер полезной нагрузки

Полезные данные( как при получении, так и при отправке) кодируются в кодировке UTF-8 при отправке по проводу. В этом формате его размер ограничен 100 МБ.

Длина URL-адреса

Максимальная длина URL-адреса (созданная после использования параметра @url и добавление указанных учетных данных в строку запроса( при наличии) составляет 8 КБ; максимальная длина строки запроса (строка запроса и строка запроса учетных данных) составляет 4 КБ.

Размер заголовков

Максимальный размер заголовка запроса и ответа (все поля заголовков: заголовки, передаваемые через параметр @headers + заголовки учетных данных + предоставленные системой заголовки) составляет 8 КБ.

Регулирование

Количество одновременных подключений к внешним конечным точкам, выполненных через sp_invoke_external_rest_endpoint , ограничено до 10 % рабочих потоков, при этом не более 150 рабочих ролей. Регулирование отдельной базы данных применяется на уровне базы данных, а регулирование эластичного пула применяется как на уровне базы данных, так и на уровне пула.

Чтобы проверить, сколько одновременных подключений к базе данных может поддерживаться, выполните следующий запрос:

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, если вы достигли ограничений эластичных пулов). Например:

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.

Подтверждение компетенции

Для правильного вызова некоторых конечных точек REST требуется проверка подлинности. Обычно проверка подлинности выполняется путем передачи определенных пар "ключ-значение" в строке запроса или в заголовках HTTP, заданных запросом.

Для безопасного хранения данных проверки подлинности (например, маркера носителя) можно использовать DATABASE SCOPED CREDENTIAL для sp_invoke_external_rest_endpoint вызова защищенной конечной точки. При создании DATABASE SCOPED CREDENTIALпараметра используйте IDENTITY параметр, чтобы указать, какие данные проверки подлинности передаются в вызываемую конечную точку и как. IDENTITY поддерживает четыре варианта:

  • HTTPEndpointHeaders: отправка указанных данных проверки подлинности с помощью заголовков запроса
  • HTTPEndpointQueryString: отправка указанных данных проверки подлинности с помощью строки запроса
  • Managed Identity: отправка управляемого удостоверения, назначаемого системой, с помощью заголовков запроса
  • 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 добавляется в заголовки запроса. Пара "ключ-значение", содержащая сведения о проверке подлинности, должна быть предоставлена с помощью SECRET параметра с использованием неструктурированного формата JSON. Например:

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 должны соответствовать определенным правилам, чтобы использовать их sp_invoke_external_rest_endpoint. Ниже приведены правила.

  • Должен быть допустимым URL-адресом
  • Домен URL-адреса должен быть одним из этих доменов, включенных в список разрешений.
  • URL-адрес не должен содержать строку запроса
  • Протокол + полное доменное имя (FQDN) вызываемого URL-адреса должно соответствовать протоколу +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. Проверьте, совпадают ли URL-адреса и учетные данные с помощью RFC, то есть:
    • Проверьте схему и узел с помощью нечувствительной сортировки регистра (Latin1_General_100_CI_AS_KS_WS_SC)
    • Проверьте все остальные сегменты URL-адреса сравниваются в параметров сортировки с учетом регистра (Latin1_General_100_BIN2)
  2. Убедитесь, что URL-адрес и учетные данные соответствуют правилам сортировки базы данных (и без кодирования URL-адресов).

Предоставление разрешений на использование учетных данных

Пользователи базы данных, обращающиеся к учетным данным DATABASE SCOPED, должны иметь разрешение на использование учетных данных.

Чтобы использовать учетные данные, пользователь базы данных должен иметь REFERENCES разрешение на определенные учетные данные:

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

Замечания

Тип ожидания

Когда sp_invoke_external_rest_endpoint ожидает завершения вызова вызываемой HTTP_EXTERNAL_CONNECTION службы, он сообщает тип ожидания.

HTTPS и TLS

Поддерживаются только конечные точки, настроенные для использования HTTPS с протоколом шифрования TLS.

Перенаправления HTTP

sp_invoke_external_rest_endpoint не выполняет автоматическое выполнение перенаправления HTTP, полученного в качестве ответа от вызываемой конечной точки.

Заголовки HTTP

sp_invoke_external_rest_endpoint автоматически внедряет следующие заголовки в HTTP-запрос:

  • тип контента: задано значение application/json; charset=utf-8
  • accept: set to application/json
  • user-agent: задайте <EDITION>/<PRODUCT VERSION> для примера: SQL Azure/12.0.2000.8

Хотя агент пользователя всегда перезаписывается хранимой процедурой, тип контента и принимать значения заголовков можно использовать с помощью параметра @headers . Только директива типа носителя может быть указана в типе контента и указана директива charset или граничной директивы.

Полезные данные запроса и ответа, поддерживаемые типы носителей

Ниже приведены допустимые значения для типа контента заголовка.

  • application/json
  • application/vnd.microsoft.*.json
  • Приложение/XML
  • application/vnd.microsoft.*.xml
  • application/vnd.microsoft.*+xml
  • application/x-www-form-urlencoded
  • СМС/*

Для заголовка accept приведены допустимые значения.

  • application/json
  • Приложение/XML
  • СМС/*

Дополнительные сведения о типах заголовков текста см. в реестре типов текста в IANA.

Примечание.

Если вы тестируете вызов конечной точки REST с другими инструментами, такими как cURL или любой современный клиент REST, например "Бессонница", обязательно включите те же заголовки, которые автоматически внедряются, sp_invoke_external_rest_endpoint чтобы иметь то же поведение и результаты.

Рекомендации

Использование метода пакетной обработки

Если необходимо отправить набор строк в конечную точку REST, например в функцию Azure или концентратор событий, рекомендуется пакетировать строки в один документ JSON, чтобы избежать затрат на вызов HTTPS для каждой строки, отправленной. Это можно сделать с помощью инструкции 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;

Примеры

Ниже приведены некоторые примеры интеграции с общими службами Azure, такими как sp_invoke_external_rest_endpoint Функции Azure или Центры событий Azure. Дополнительные примеры для интеграции с другими службами можно найти на сайте GitHub.

А. Вызов функции Azure с помощью привязки триггера HTTP без проверки подлинности

В следующем примере вызывается функция Azure с помощью привязки триггера HTTP, разрешающей анонимный доступ.

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;

В. Вызов функции Azure с помощью привязки триггера HTTP с ключом авторизации

В следующем примере вызывается функция Azure с помощью привязки триггера HTTP, настроенной для требования ключа авторизации. Ключ авторизации передается в заголовке x-function-key в соответствии с требованиями Функций Azure. Дополнительные сведения см. в разделе Функции Azure — авторизация ключа 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;

В. Чтение содержимого файла из Хранилище BLOB-объектов Azure с помощью маркера SAS

В этом примере файл считывается из Хранилище BLOB-объектов Azure с помощью маркера SAS для проверки подлинности. Результаты возвращаются в ФОРМАТЕ 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;

Д. Отправка сообщения в концентратор событий с помощью управляемого удостоверения База данных SQL Azure

В этом примере показано, как отправлять сообщения в Центры событий с помощью управляемого удостоверения SQL Azure. Убедитесь, что вы настроили управляемое удостоверение системы для База данных SQL Azure логического сервера, на котором размещена база данных, например:

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

После этого настройте Центры событий, чтобы позволить Управляемому удостоверению SQL Server Azure отправлять сообщения (роль "Центры событий Azure отправителю данных") в нужный концентратор событий. Дополнительные сведения см. в разделе "Использование центров событий с управляемыми удостоверениями".

После этого можно использовать Managed Identity имя удостоверения при определении учетных данных в области базы данных, используемых sp_invoke_external_rest_endpoint. Как описано в статье Аутентификация приложения с помощью идентификатора Microsoft Entra для доступа к ресурсам Центров событий, имя ресурса (или идентификатор), используемое при использовании проверки подлинности Microsoft Entra: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;

Е. Чтение и запись файла в хранилище файлов Azure с помощью учетных данных База данных SQL Azure области

В этом примере файл записывается в хранилище файлов Azure с помощью База данных SQL Azure учетных данных для проверки подлинности, а затем возвращает содержимое. Результаты возвращаются в ФОРМАТЕ XML, поэтому необходимо использовать заголовок "Accept":"application/xml".

Начните с создания главного ключа для базы данных SQL Azure. Замените <password> строгим паролем.

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

Затем создайте учетные данные в области базы данных с помощью маркера SAS, предоставленного учетной записью Хранилище BLOB-объектов Azure. Замените <token> предоставленным маркером SAS.

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

Затем создайте файл и добавьте в него текст с помощью следующих двух инструкций. Замените <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. Вызов Azure OpenAI с помощью управляемого удостоверения

В следующем примере вызывается модель Azure OpenAI с помощью управляемых удостоверений в Microsoft Entra для SQL Azure. Замените <my-azure-openai-endpoint> конечную точку и имя модели Azure OpenAI соответственно и убедитесь, что вы предоставили роль "Управляемые удостоверения" роли <model-deployment-name>.

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