Freigeben über


sp_invoke_external_rest_endpoint (Transact-SQL)

Gilt für: SQL Server 2025 (17.x) Azure SQL-Datenbank AzureSQL Managed InstanceSQL SQL-Datenbank in Microsoft Fabric

Die sp_invoke_external_rest_endpoint gespeicherte Prozedur ruft einen HTTPS-REST-Endpunkt auf, der als Eingabeargument für die Prozedur bereitgestellt wird.

Note

Das sp_invoke_external_rest_endpoint gespeicherte Verfahren ist in der Vorschau für SQL Server 2025 (17.x).

Möglichkeiten zur Minderung des Risikos eines nicht autorisierten Zugriffs oder der Übertragung von Daten

Caution

Die Verwendung der sp_invoke_external_rest_endpoint gespeicherten Prozedur ermöglicht die Übertragung von Daten an eine externe Entität.

Um das Risiko eines nicht autorisierten Zugriffs oder der Übertragung von Daten zu verringern, sollten Sie die folgenden bewährten Sicherheitsmethoden berücksichtigen:

  • Implementieren sie starke Zugriffssteuerungen: Stellen Sie sicher, dass nur autorisierte Benutzer Zugriff auf vertrauliche Daten und REST-API-Endpunkte haben. Verwenden Sie das Prinzip der geringsten Rechtesowie Datenbankrollen und -berechtigungen.
  • Ordnungsgemäße Authentifizierung und Autorisierung: Stellen Sie sicher, dass alle REST-Aufrufe authentifiziert und autorisiert sind, um unbefugten Zugriff zu verhindern.
  • Überwachen und Überwachen des Zugriffs: Überwachen und Überwachen des Zugriffs auf die Datenbank und REST-API-Aufrufe regelmäßig, um verdächtige Aktivitäten zu erkennen.
  • regelmäßige Sicherheitsbewertungen: Führen Sie regelmäßige Sicherheitsbewertungen und Sicherheitsrisiken durch, um potenzielle Risiken zu identifizieren und zu mindern.
  • Mitarbeiterschulung: Informieren Sie Mitarbeiter über die Risiken der Datenexfiltration und die Bedeutung der folgenden Sicherheitsprotokolle.

Syntax

Transact-SQL-Syntaxkonventionen

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 ]
  [ , [ @retry_count = ] # of retries if there are errors ] 

Arguments

[ @url = ] N'url'

DIE URL des HTTPS-REST-Endpunkts, der aufgerufen werden soll. @url ist nvarchar(4000) ohne Standard.

[ @payload = ] N'request_payload'

Unicode-Zeichenfolge in einem JSON-, XML- oder TEXT-Format, das die Nutzlast enthält, die an den HTTPS-REST-Endpunkt gesendet werden soll. Nutzlasten müssen ein gültiges JSON-Dokument, ein wohlgeformtes XML-Dokument oder Text sein. @payload ist nvarchar(max) ohne Standard.

[ @headers = ] N'headers'

Header, die als Teil der Anforderung an den HTTPS-REST-Endpunkt gesendet werden müssen. Header müssen mit einem flachen JSON-Format (einem JSON-Dokument ohne geschachtelte Strukturen) angegeben werden. Überschriften, die in der Namensliste "Verbotene Kopfzeilen " definiert sind, werden ignoriert, auch wenn der parameter @headers explizit übergeben wird; ihre Werte werden beim Starten der HTTPS-Anforderung verworfen oder durch vom System bereitgestellte Werte ersetzt.

Der @headers-Parameter ist nvarchar(4000) ohne Standard.

[ @method = ] N'methode'

HTTP-Methode zum Aufrufen der URL. Muss einer der folgenden Werte sein: GET, , POST, PUT, PATCH, . DELETEHEAD @method ist nvarchar(6) mit POST dem Standardwert.

[ @timeout = ] Sekunden

Zeit in Sekunden, die für die Ausführung des HTTPS-Aufrufs zulässig ist. Wenn die vollständige HTTP-Anforderung und -Antwort nicht innerhalb des definierten Timeouts in Sekunden gesendet und empfangen werden kann, wird die Ausführung der gespeicherten Prozedur angehalten und eine Ausnahme ausgelöst. Timeout beginnt, wenn die HTTP-Verbindung gestartet und beendet wird, wenn die Antwort und nutzlast, falls vorhanden, empfangen wurde. @timeout ist ein positiver Kleinerwert mit dem Standardwert 30. Akzeptierte Werte: 1 bis 230.

Wenn der @retry_count Parameter angegeben ist, fungiert der @timeout Parameter als kumuliertes Timeout für die Prozedur.

[ @credential = ] Anmeldeinformationen

Geben Sie an, welches DATABASE SCOPED CREDENTIAL-Objekt verwendet wird, um Authentifizierungsinformationen in die HTTPS-Anforderung einzustellen. @credential ist "sysname" ohne Standardwert.

@response AUSGABE

Zulassen, dass die vom aufgerufenen Endpunkt empfangene Antwort an die angegebene Variable übergeben wird. @response ist nvarchar(max).

[ @retry_count = ] Anzahl der Wiederholungen, wenn Fehler vorhanden sind

Gibt an, wie oft die gespeicherte Prozedur eine Verbindung mit dem angegebenen Endpunkt herstellt, wenn ein Fehler auftritt. @retry_count ist ein positiver Winzwert mit dem Standardwert 0. Akzeptierte Werte: 0 bis 10, wobei 0 alle Wiederholungslogik umgeht. Das Wiederholungsintervall wird mithilfe des Retry-After Headers bestimmt, wenn es vorhanden ist. Wenn der Header nicht vorhanden ist, wendet das System eine exponentielle Backoff-Strategie für bestimmte Fehlercodes an. In allen anderen Fällen wird eine Standardverzögerung von 200 Millisekunden verwendet.

Rückgabewert

Die Ausführung gibt zurück 0 , wenn der HTTPS-Aufruf abgeschlossen wurde und der empfangene HTTP-Statuscode ein 2xx-Statuscode (Success). Wenn der empfangene HTTP-Statuscode nicht im 2xx-Bereich liegt, ist der Rückgabewert der empfangene HTTP-Statuscode. Wenn der HTTPS-Aufruf überhaupt nicht ausgeführt werden kann, wird eine Ausnahme ausgelöst.

Permissions

Datenbankberechtigungen

Erfordert EXECUTE ANY EXTERNAL ENDPOINT database permission.

Beispiel:

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

Aktivieren in SQL Server 2025 und azure SQL Managed Instance

Note

Das sp_invoke_external_rest_endpoint gespeicherte Verfahren ist in der Vorschau für SQL Server 2025 (17.x).

Das gespeicherte sp_invoke_external_rest_endpoint Verfahren ist in SQL Server 2025 (17.x) und Azure SQL Managed Instance mit der SQL Server 2025- oder Always-up-to-Date-Update-Policy verfügbar und standardmäßig deaktiviert.

Um die gespeicherte sp_invoke_external_rest_endpoint Prozedur in SQL Server 2025 (17.x) und Azure SQL Managed Instance zu aktivieren, führen Sie folgenden T-SQL-Code aus:

EXECUTE sp_configure 'external rest endpoint enabled', 1;

RECONFIGURE WITH OVERRIDE;

Um eine sp_configure Konfigurationsoption zu ändern oder die RECONFIGURE-Anweisung auszuführen, muss einem Benutzer die Berechtigung auf Serverebene ALTER SETTINGS erteilt werden. Die ALTER SETTINGS-Berechtigung wird implizit von den festen Serverrollen "sysadmin" und "serveradmin" gespeichert.

Note

sp_invoke_external_rest_endpoint ist in Azure SQL-Datenbank und SQL-Datenbank in Fabric standardmäßig aktiviert.

Antwortformat

Die Antwort des HTTP-Aufrufs und die resultierenden Daten, die vom aufgerufenen Endpunkt zurückgesendet werden, sind über den @response Ausgabeparameter verfügbar. @response kann ein JSON-Dokument mit dem folgenden Schema enthalten:

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

Specifically:

  • antwort: ein JSON-Objekt, das das HTTP-Ergebnis und andere Antwortmetadaten enthält.
  • Ergebnis: die JSON-Nutzlast, die vom HTTP-Aufruf zurückgegeben wird. Wird ausgelassen, wenn das empfangene HTTP-Ergebnis ein 204 (No Content) ist.

Oder die @response kann ein XML-Dokument mit dem folgenden Schema enthalten:

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

Specifically:

  • antwort: ein XML-Objekt, das das HTTP-Ergebnis und andere Antwortmetadaten enthält.
  • Ergebnis: die vom HTTP-Aufruf zurückgegebene XML-Nutzlast. Wird ausgelassen, wenn das empfangene HTTP-Ergebnis ein 204 (No Content) ist.

response Im Abschnitt werden neben dem HTTP-Statuscode und der Beschreibung die gesamte Gruppe der empfangenen Antwortheader im headers Objekt bereitgestellt. Das folgende Beispiel zeigt einen response Abschnitt in JSON (auch die Struktur für Textantworten):

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

Das folgende Beispiel zeigt einen response Abschnitt in 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>

Zulässige Endpunkte

Important

Diese Liste gilt nur für Azure SQL-Datenbank und azure SQL Managed Instance.

Es sind nur Aufrufe an Endpunkte für die folgenden Dienste zulässig:

Azure-Dienst Domain
Azure Functions *.azurewebsites.net
Azure-App s-Dienst *.azurewebsites.net
Azure App Service-Umgebung *.appserviceenvironment.net
Azure Statische Webanwendungen *.azurestaticapps.net
Azure Logic Apps *.logic.azure.com
Azure Event Hubs *.servicebus.windows.net
Azure-Ereignisraster *.eventgrid.azure.net
Azure KI-Services *.cognitiveservices.azure.com
*.api.cognitive.microsoft.com
Azure OpenAI *.openai.azure.com
PowerApps / Dataverse *.api.crm.dynamics.com
Microsoft Dynamics *.dynamics.com
Azure-Containerinstanzen *.azurecontainer.io
Azure Container Apps – ein Dienst für containerbasierte Anwendungen *.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 (Speicherdienst von Azure für unstrukturierte Daten) *.blob.core.windows.net
Azure Files *.file.core.windows.net
Azure Queue Storage (Warteschlangenspeicher) *.queue.core.windows.net
Azure Tabellenspeicher *.table.core.windows.net
Azure Communication Services *.communications.azure.com
Bing Search api.bing.microsoft.com
Azure Key Vault (ein Dienst zur sicheren Verwaltung kryptografischer Schlüssel) *.vault.azure.net
Azure KI Cognitive Search *.search.windows.net
Azure Maps *.atlas.microsoft.com
Azure KI Übersetzer api.cognitive.microsofttranslator.com

Ausgehende Firewallregeln für Azure SQL-Datenbank und Azure Synapse Analytics-Kontrollmechanismus können verwendet werden, um den ausgehenden Zugriff auf externe Endpunkte weiter einzuschränken.

Note

Wenn Sie einen REST-Dienst aufrufen möchten, der nicht in der Liste zulässig ist, können Sie die API-Verwaltung verwenden, um den gewünschten Dienst sicher verfügbar zu machen und verfügbar zu sp_invoke_external_rest_endpointmachen.

Limits

Nutzlastgröße

Nutzlast, sowohl beim Empfang als auch beim Senden, wird UTF-8 codiert, wenn sie über das Kabel gesendet werden. In diesem Format ist die Größe auf 100 MB begrenzt.

URL-Länge

Die maximale URL-Länge (generiert nach Verwendung des @url Parameters und Hinzufügen der angegebenen Anmeldeinformationen zur Abfragezeichenfolge, falls vorhanden), beträgt 8 KB; die maximale Länge der Abfragezeichenfolge (Abfragezeichenfolge + Abfragezeichenfolge mit Anmeldeinformationen) beträgt 4 KB.

Größe der Kopfzeilen

Die maximale Anforderungs- und Antwortheadergröße (alle Kopfzeilenfelder: Kopfzeilen, die über @headers Parameter + Anmeldeinformationsheader + vom System bereitgestellte Header übergeben werden) beträgt 8 KB.

Throttling

Die Anzahl der gleichzeitigen Verbindungen mit externen Endpunkten, die über sp_invoke_external_rest_endpoint diese Verbindung durchgeführt werden, sind auf 10 % der Arbeitsthreads begrenzt, mit maximal 150 Mitarbeitern. Bei einer einzelnen Datenbankeinschränkung wird auf Datenbankebene erzwungen, während bei einer flexiblen Pooldrosselung sowohl auf Datenbank- als auch auf Poolebene erzwungen wird.

Führen Sie die folgende Abfrage aus, um zu überprüfen, wie viele gleichzeitige Verbindungen eine Datenbank erhalten kann:

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();

Wenn eine neue Verbindung mit einem externen Endpunkt sp_invoke_external_rest_endpoint versucht wird, wenn die maximalen gleichzeitigen Verbindungen bereits erreicht sind, wird der Fehler 10928 (oder 10936, wenn Sie die Grenzwerte für elastische Pools erreicht haben) ausgelöst. Beispiel:

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

Einige REST-Endpunkte erfordern eine Authentifizierung, um ordnungsgemäß aufgerufen zu werden. Die Authentifizierung kann in der Regel erfolgen, indem bestimmte Schlüsselwertpaare in der Abfragezeichenfolge oder in den MIT der Anforderung festgelegten HTTP-Headern übergeben werden.

Es ist möglich, DATABASE SCOPED CREDENTIAL Authentifizierungsdaten (z. B. ein Bearer-Token) sicher zu speichern, um von sp_invoke_external_rest_endpoint einem geschützten Endpunkt aufgerufen zu werden. Verwenden Sie beim Erstellen des DATABASE SCOPED CREDENTIALParameters, IDENTITY um anzugeben, welche Authentifizierungsdaten an den aufgerufenen Endpunkt übergeben werden und wie. IDENTITY unterstützt vier Optionen:

  • HTTPEndpointHeaders: Senden von angegebenen Authentifizierungsdaten mithilfe der Anforderungsheader
  • HTTPEndpointQueryString: Senden von angegebenen Authentifizierungsdaten mithilfe der Abfragezeichenfolge
  • Managed Identity: Senden der vom System zugewiesenen verwalteten Identität mithilfe der Anforderungsheader
  • Shared Access Signature: Bereitstellen eines eingeschränkten delegierten Zugriffs auf Ressourcen über eine signierte URL (auch als SAS bezeichnet)

Die erstellung DATABASE SCOPED CREDENTIAL kann über den parameter @credential verwendet werden:

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

Mit diesem IDENTITY Wert wird der DATABASE SCOPED CREDENTIAL Anforderungsheader hinzugefügt. Das Schlüssel-Wert-Paar, das die Authentifizierungsinformationen enthält, muss über den SECRET Parameter mit einem flachen JSON-Format bereitgestellt werden. Beispiel:

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

Namensregeln für Anmeldeinformationen

Die erstellten DATABASE SCOPED-ANMELDEINFORMATIONEN müssen bestimmten Regeln entsprechen, damit sie verwendet sp_invoke_external_rest_endpointwerden können. Die Regeln sind wie folgt:

  • Muss eine gültige URL sein
  • Die URL-Domäne muss eine dieser Domänen sein, die in der Zulassungsliste enthalten sind.
  • Die URL darf keine Abfragezeichenfolge enthalten.
  • Protokoll + Vollqualifizierter Domänenname (FQDN) der aufgerufenen URL muss mit Protokoll + FQDN des Anmeldeinformationsnamens übereinstimmen.
  • Jeder Teil des aufgerufenen URL-Pfads muss vollständig mit dem jeweiligen Teil des URL-Pfads im Anmeldeinformationsnamen übereinstimmen.
  • Die Anmeldeinformationen müssen auf einen Pfad verweisen, der allgemeiner als die Anforderungs-URL ist. Beispielsweise kann eine für den Pfad https://northwind.azurewebsite.net/customers erstellte Anmeldeinformation nicht für die URL verwendet werden. https://northwind.azurewebsite.net

Regeln für die Sortierung und Anmeldeinformationen

RFC 3986 Section 6.2.2.1 gibt an, dass "Wenn ein URI Komponenten der generischen Syntax verwendet, gelten die Regeln für die Komponentensyntax immer; nämlich, dass das Schema und der Host die Groß-/Kleinschreibung nicht beachten" und RFC 7230 Section 2.7.3 erwähnt, dass "alle anderen in einer Groß-/Kleinschreibung verglichen werden".

Da auf Datenbankebene eine Sortierregel festgelegt ist, wird die folgende Logik angewendet, um mit der Datenbanksortierungsregel und dem oben genannten RFC in Einklang zu treten. (Die beschriebene Regel könnte möglicherweise restriktiver sein als die RFC-Regeln, z. B. wenn die Datenbank für die Verwendung einer Sortierung mit Groß-/Kleinschreibung festgelegt ist.):

  1. Überprüfen Sie, ob die URL und anmeldeinformationen mit rfc übereinstimmen, was bedeutet:
    • Überprüfen sie das Schema und den Host mithilfe einer Sortierung ohne Groß-/Kleinschreibung (Latin1_General_100_CI_AS_KS_WS_SC)
    • Überprüfen, ob alle anderen Segmente der URL in einer Sortierung mit Groß-/Kleinschreibung verglichen werden (Latin1_General_100_BIN2)
  2. Überprüfen Sie, ob die URL und die Anmeldeinformationen mit den Datenbanksortierungsregeln übereinstimmen (und ohne URL-Codierung).

Erteilen von Berechtigungen zur Verwendung einer Anmeldeinformation

Datenbankbenutzer, die auf DATENBANKBEREICHS-ANMELDEINFORMATIONEN zugreifen, müssen über die Berechtigung zum Verwenden dieser Anmeldeinformationen verfügen.

Um die Anmeldeinformationen zu verwenden, muss ein Datenbankbenutzer über die Berechtigung für bestimmte Anmeldeinformationen verfügen REFERENCES :

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

Remarks

Wartetyp

Wenn sp_invoke_external_rest_endpoint auf den Abschluss des Aufrufs des aufgerufenen Diensts gewartet wird, meldet er einen HTTP_EXTERNAL_CONNECTION Wartetyp.

HTTPS und TLS

Es werden nur Endpunkte unterstützt, die für die Verwendung von HTTPS mit TLS-Verschlüsselungsprotokoll konfiguriert sind.

HTTP-Umleitungen

sp_invoke_external_rest_endpoint folgt keiner HTTP-Umleitung, die als Antwort vom aufgerufenen Endpunkt empfangen wird.

HTTP-Header

sp_invoke_external_rest_endpoint fügt automatisch die folgenden Header in die HTTP-Anforderung ein:

  • inhaltstyp: auf application/json; charset=utf-8
  • accept: Set to application/json
  • User-Agent: Zum Beispiel <EDITION>/<PRODUCT VERSION> : SQL Azure/12.0.2000.8

Während der Benutzer-Agent immer von der gespeicherten Prozedur überschrieben wird, kann der Inhaltstyp und die Annahme von Headerwerten über den parameter @headers benutzerdefinierte werden. Nur die Medientypdirektive darf im Inhaltstyp angegeben werden und die Angabe der Zeichensatz- oder Begrenzungsdirektiven ist nicht möglich.

Anforderungs- und Antwortnutzlast unterstützte Medientypen

Im Folgenden finden Sie akzeptierte Werte für den Headerinhaltstyp.

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

Für den Accept-Header sind die folgenden Werte zulässig.

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

Weitere Informationen zu Textkopfzeilentypen finden Sie in der Texttypregistrierung bei IANA.

Note

Wenn Sie den Aufruf des REST-Endpunkts mit anderen Tools wie cURL oder einem modernen REST-Client wie Schlaflosigkeit testen, stellen Sie sicher, dass sie dieselben Header enthalten, die automatisch eingefügt sp_invoke_external_rest_endpoint werden, um dasselbe Verhalten und die gleichen Ergebnisse zu haben.

Wiederholungszählungslogik

Wenn Sie den parameter @retry_count festlegen, wird die Anforderung wiederholt, wenn die folgenden Fehler aufgetreten sind:

HTTP-Fehler

HTTP-Statuscode Fehler Description
408 Anforderungstimeout Der Client hat keine Anforderung innerhalb des Zeitlimits des Servers oder das Servertimeout beim Warten erzeugt.
429 Zu viele Anforderungen Der Client ist zinsgeschränkt. Wiederholen Sie die Zeit basierend auf dem Headerwert "Retry-After", falls angegeben.
500 Interner Serverfehler Generischer Serverfehler.
502 Ungültiges Gateway Der Server hat eine ungültige Antwort von einem Back-End erhalten.
503 Dienst nicht verfügbar Gibt eine temporäre Überladung oder Ausfallzeit an.
504 Gatewaytimeout Der Server hat keine rechtzeitige Antwort erhalten.

Bewährte Methoden

Verwenden einer Batchverarbeitungsmethode

Wenn Sie eine Reihe von Zeilen an einen REST-Endpunkt senden müssen, z. B. an eine Azure-Funktion oder an einen Event Hub, empfiehlt es sich, die Zeilen in ein einzelnes JSON-Dokument zu stapeln, um den HTTPS-Aufrufaufwand für jede gesendete Zeile zu vermeiden. Dies kann beispielsweise mithilfe der FOR JSON Anweisung erfolgen:

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

Hier finden Sie einige Beispiele für die Integration sp_invoke_external_rest_endpoint in gängige Azure-Dienste wie Azure Functions oder Azure Event Hubs. Weitere Beispiele für die Integration in andere Dienste finden Sie auf GitHub.

A. Aufrufen einer Azure-Funktion mithilfe einer HTTP-Triggerbindung ohne Authentifizierung

Im folgenden Beispiel wird eine Azure-Funktion mithilfe einer HTTP-Triggerbindung aufgerufen, die anonymen Zugriff zulässt.

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. Aufrufen einer Azure-Funktion mithilfe einer HTTP-Triggerbindung mit einem Autorisierungsschlüssel

Im folgenden Beispiel wird eine Azure-Funktion mithilfe einer HTTP-Triggerbindung aufgerufen, die so konfiguriert ist, dass ein Autorisierungsschlüssel erforderlich ist. Der Autorisierungsschlüssel wird nach Bedarf von Azure Functions im x-function-key Header übergeben. Weitere Informationen finden Sie unter Azure Functions – API-Schlüsselautorisierung.

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. Lesen des Inhalts einer Datei aus Azure Blob Storage mit einem SAS-Token

In diesem Beispiel wird eine Datei aus Azure Blob Storage mit einem SAS-Token für die Authentifizierung gelesen. Die Ergebnisse werden in XML zurückgegeben, sodass Sie den Header "Accept":"application/xml"verwenden müssen.

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. Senden einer Nachricht an einen Ereignishub mithilfe der Azure SQL-Datenbank verwalteten Identität

In diesem Beispiel wird gezeigt, wie Sie Nachrichten mithilfe der verwalteten Azure SQL-Identität an Event Hubs senden können. Stellen Sie sicher, dass Sie die vom System verwaltete Identität für den Azure SQL-Datenbank logischen Server konfiguriert haben, auf dem Ihre Datenbank gehostet wird, z. B.:

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

Konfigurieren Sie anschließend Event Hubs so, dass die verwaltete Identität von Azure SQL Server Nachrichten ("Azure Event Hubs Data Sender"-Rolle) an den gewünschten Event Hub senden kann. Weitere Informationen finden Sie unter Verwenden von Event Hubs mit verwalteten Identitäten.

Sobald dies erfolgt ist, können Sie den Managed Identity Identitätsnamen verwenden, wenn Sie die von der Datenbank verwendeten sp_invoke_external_rest_endpointAnmeldeinformationen mit Bereich definieren. Wie in der Authentifizierung einer Anwendung mit der Microsoft Entra-ID für den Zugriff auf Event Hubs-Ressourcen erläutert, lautet der Ressourcenname (oder die ID), der bei der Verwendung der Microsoft Entra-Authentifizierung verwendet werden soll 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. Lesen und Schreiben einer Datei in Azure File Storage mit einer Azure SQL-Datenbank bereichsbezogenen Anmeldeinformationen

In diesem Beispiel wird eine Datei mithilfe eines Azure SQL-Datenbank bereichsbezogenen Anmeldeinformationen für die Authentifizierung in einen Azure-Dateispeicher geschrieben und anschließend der Inhalt zurückgegeben. Die Ergebnisse werden in XML zurückgegeben, sodass Sie den Header "Accept":"application/xml"verwenden müssen.

Erstellen Sie zunächst einen Hauptschlüssel für die Azure SQL-Datenbank. Ersetzen Sie <password> es durch ein sicheres Kennwort.

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

Erstellen Sie dann die Anmeldeinformationen für den Datenbankbereich mithilfe des SAS-Tokens, das vom Azure Blob Storage-Konto bereitgestellt wird. Ersetzen Sie <token> es durch das bereitgestellte SAS-Token.

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

Erstellen Sie als Nächstes die Datei, und fügen Sie ihr Text mit den folgenden beiden Anweisungen hinzu. Ersetzen Sie <domain> den entsprechenden Pfad.

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

Verwenden Sie schließlich die folgende Anweisung, um die Datei zu lesen. Ersetzen Sie <domain> den entsprechenden Pfad.

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. Aufrufen einer Azure OpenAI mit verwalteter Identität

Im folgenden Beispiel wird ein Azure OpenAI-Modell mit verwalteten Identitäten in Microsoft Entra für Azure SQL aufgerufen. Ersetzen Sie <my-azure-openai-endpoint><model-deployment-name> ihren Azure OpenAI-Endpunkt bzw. ihren Modellnamen, und stellen Sie sicher, dass Sie die Managed Identity der OpenAI-Benutzerrolle "Cognitive Services" im Azure OpenAI-Dienst erteilt haben.

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