Dela via


sp_invoke_external_rest_endpoint (Transact-SQL)

gäller för:Azure SQL DatabaseSQL-databas i Microsoft Fabric

Den sp_invoke_external_rest_endpoint lagrade proceduren anropar en HTTPS REST-slutpunkt som anges som ett indataargument till proceduren.

Syntax

Transact-SQL syntaxkonventioner

EXEC @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 ]

Argument

[ @url = ] N'url'

URL för HTTPS REST-slutpunkten som ska anropas. @url är nvarchar(4000) utan standard.

[ @payload = ] N'request_payload'

Unicode-sträng i ett JSON-, XML- eller TEXT-format som innehåller nyttolasten som ska skickas till HTTPS REST-slutpunkten. Nyttolaster måste vara ett giltigt JSON-dokument, ett välformat XML-dokument eller text. @payload är nvarchar(max) utan standard.

[ @headers = ] N"rubriker"

Rubriker som måste skickas som en del av begäran till HTTPS REST-slutpunkten. Rubriker måste anges med ett platt JSON-format (ett JSON-dokument utan kapslade strukturer). Rubriker som definierats i namn på förbjudna rubriker lista ignoreras även om de uttryckligen skickas i parametern @headers. deras värden ignoreras eller ersätts med systembaserade värden när HTTPS-begäran startas.

Parametern @headers är nvarchar(4000) utan standard.

[ @method = ] Nmetod

HTTP-metod för att anropa URL:en. Måste vara något av följande värden: GET, POST, PUT, PATCH, DELETE, HEAD. @method är nvarchar(6) med POST som standardvärde.

[ @timeout = ] sekunder

Tid i sekunder tillåts för HTTPS-anropet att köras. Om den fullständiga HTTP-begäran och -svaret inte kan skickas och tas emot inom den definierade tidsgränsen på några sekunder stoppas körningen av den lagrade proceduren och ett undantag utlöses. Tidsgränsen startar när HTTP-anslutningen startar och slutar när svaret, och nyttolasten som ingår om någon, har tagits emot. @timeout är en positiv liten med standardvärdet 30. Godkända värden: 1 till 230.

[ @credential = ] autentiseringsuppgifter

Ange vilket DATABASE SCOPED CREDENTIAL-objekt som används för att mata in autentiseringsinformation i HTTPS-begäran. @credential är sysname utan standardvärde.

@response UTDATA

Tillåt att svaret som tas emot från den anropade slutpunkten skickas till den angivna variabeln. @response är nvarchar(max).

Returvärde

Körningen returnerar 0 om HTTPS-anropet har utförts och HTTP-statuskoden som tagits emot är en 2xx-statuskod (Success). Om HTTP-statuskoden som tas emot inte finns i 2xx-intervallet blir returvärdet HTTP-statuskoden som tas emot. Om HTTPS-anropet inte kan utföras alls utlöses ett undantag.

Behörigheter

Kräver KÖR VALFRI EXTERN ENDPOINT-databasbehörighet.

Till exempel:

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

Svarsformat

Svaret från HTTP-anropet och resulterande data som skickas tillbaka av den anropade slutpunkten är tillgängligt via parametern @response utdata. @response kan innehålla ett JSON-dokument med följande schema:

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

Specifikt:

  • svar: ett JSON-objekt som innehåller HTTP-resultatet och andra svarsmetadata.
  • resultat: JSON-nyttolasten som returneras av HTTP-anropet. Utelämnas om det mottagna HTTP-resultatet är 204 (No Content).

Eller så kan @response innehålla ett XML-dokument med följande schema:

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

Specifikt:

  • svar: ett XML-objekt som innehåller HTTP-resultatet och andra svarsmetadata.
  • resultat: XML-nyttolasten som returneras av HTTP-anropet. Utelämnas om det mottagna HTTP-resultatet är 204 (No Content).

I avsnittet response, förutom HTTP-statuskoden och beskrivningen, kommer hela uppsättningen mottagna svarshuvuden att anges i headers-objektet. I följande exempel visas ett response avsnitt i JSON (även strukturen för textsvar):

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

I följande exempel visas ett response avsnitt i 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>

Tillåtna slutpunkter

Endast anrop till slutpunkter i följande tjänster tillåts:

Azure Service Domän
Azure Functions *.azurewebsites.net
Azure Apps Service *.azurewebsites.net
Azure App Service-miljö *.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 Cognitive Services *.cognitiveservices.azure.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-sökning api.bing.microsoft.com
Azure Key Vault *.vault.azure.net
Azure AI Search *.search.windows.net
Azure Maps *.atlas.microsoft.com
Azure AI Translator api.cognitive.microsofttranslator.com

Regler för utgående brandvägg för Azure SQL Database och Azure Synapse Analytics kontrollmekanism kan användas för att ytterligare begränsa utgående åtkomst till externa slutpunkter.

Not

Om du vill anropa en REST-tjänst som inte finns i listan över tillåtna kan du använda API Management för att på ett säkert sätt exponera önskad tjänst och göra den tillgänglig för sp_invoke_external_rest_endpoint.

Gränser

Nyttolaststorlek

Nyttolasten, både när den tas emot och när den skickas, kodas UTF-8 när den skickas via kabeln. I det formatet är dess storlek begränsad till 100 MB.

URL-längd

Den maximala URL-längden (som genereras efter användning av parametern @url och tillägg av angivna autentiseringsuppgifter i frågesträngen, om någon) är 8 KB. den maximala frågesträngslängden (frågesträng + frågesträng för autentiseringsuppgifter) är 4 KB.

Sidhuvudstorlek

Den maximala storleken på begäran och svarshuvud (alla rubrikfält: huvuden som skickas via @headers parameter + autentiseringshuvud + system angivna huvuden) är 8 KB.

Strypning

Antalet samtidiga anslutningar till externa slutpunkter som görs via sp_invoke_external_rest_endpoint begränsas till 10% arbetstrådar, med högst 150 arbetare. På en enskild databas tillämpas begränsning på databasnivå, och på en elastisk pool tillämpas begränsning både på databas- och poolnivå.

Kör följande fråga för att kontrollera hur många samtidiga anslutningar en databas kan upprätthålla:

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

Om en ny anslutning till en extern slutpunkt med sp_invoke_external_rest_endpoint provas när de maximala samtidiga anslutningarna redan har nåtts, utlöses fel 10928 (eller 10936 om du har nått gränsen för elastiska pooler). Till exempel:

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.

Autentiseringsuppgifter

Vissa REST-slutpunkter kräver autentisering för att kunna anropas korrekt. Autentisering kan vanligtvis göras genom att skicka vissa specifika nyckel/värde-par i frågesträngen eller i HTTP-huvudena som angetts med begäran.

Det är möjligt att använda DATABASE SCOPED CREDENTIALS för att lagra autentiseringsdata på ett säkert sätt (t.ex. en ägartoken) som ska användas av sp_invoke_external_rest_endpoint för att anropa en skyddad slutpunkt. När du skapar DATABASE SCOPED CREDENTIAL använder du parametern IDENTITY för att ange vilka autentiseringsdata som ska skickas till den anropade slutpunkten och hur. IDENTITY har stöd för fyra alternativ:

  • HTTPEndpointHeaders: skicka angivna autentiseringsdata med hjälp av begärandehuvuden
  • HTTPEndpointQueryString: skicka angivna autentiseringsdata med hjälp av query string
  • Managed Identity: skicka systemtilldelade hanterad identitet med hjälp av begärandehuvudena
  • Shared Access Signature: ge begränsad delegerad åtkomst till resurser via en signerad URL- (kallas även SAS)

den skapade DATABASE SCOPED CREDENTIAL kan användas via parametern @credential:

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

Med det här IDENTITY-värdet läggs DATABASE SCOPED CREDENTIAL till i begärandehuvudena. Nyckel/värde-paret som innehåller autentiseringsinformationen måste anges via parametern SECRET med ett platt JSON-format. Till exempel:

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

Namnregler för autentiseringsuppgifter

Den skapade DATABASE SCOPED CREDENTIAL måste följa specifika regler för att kunna användas med sp_invoke_external_rest_endpoint. Reglerna är följande:

  • Måste vara en giltig URL
  • URL-domänen måste vara en av de domäner som ingår i listan över tillåtna domäner
  • URL:en får inte innehålla en frågesträng
  • Protokoll + Fullständigt domännamn (FQDN) för den anropade URL:en måste matcha Protokoll + FQDN för autentiseringsuppgiftsnamnet
  • Varje del av den kallade URL-sökvägen måste matcha helt med respektive del av URL-sökvägen i autentiseringsuppgiftsnamnet
  • Autentiseringsuppgifterna måste peka på en sökväg som är mer allmän än begärande-URL:en. Till exempel kan en autentiseringsuppgift som skapats för sökvägen https://northwind.azurewebsite.net/customers inte användas för URL-https://northwind.azurewebsite.net

Namnregler för sortering och autentiseringsuppgifter

RFC 3986 Avsnitt 6.2.2.1 anger att "När en URI använder komponenter i den generiska syntaxen gäller alltid reglerna för komponentsyntaxens likvärdighet. nämligen att systemet och värden är skiftlägesokänsliga", och RFC 7230 avsnitt 2.7.3 nämner att "alla andra jämförs på ett skiftlägeskänsligt sätt".

Eftersom det finns en sorteringsregel som har angetts på databasnivå tillämpas följande logik, så att den överensstämmer med databassorteringsregeln och RFC som nämns ovan. (Den beskrivna regeln kan potentiellt vara mer restriktiv än RFC-reglerna, till exempel om databasen är inställd på att använda en skiftlägeskänslig sortering.):

  1. Kontrollera om URL:en och autentiseringsuppgifterna matchar med hjälp av RFC, vilket innebär:
    • Kontrollera schemat och värden med hjälp av en skiftlägesokänslig sortering (Latin1_General_100_CI_AS_KS_WS_SC)
    • Kontrollera att alla andra segment i URL:en jämförs i en skiftlägeskänslig sortering (Latin1_General_100_BIN2)
  2. Kontrollera att URL:en och autentiseringsuppgifterna matchar med hjälp av databassorteringsreglerna (och utan att göra någon URL-kodning).

Bevilja behörigheter för att använda autentiseringsuppgifter

Databasanvändare som har åtkomst till en DATABASE SCOPED CREDENTIAL måste ha behörighet att använda den autentiseringsuppgiften.

Om du vill använda autentiseringsuppgifterna måste en databasanvändare ha REFERENCES behörighet för en specifik autentiseringsuppgift:

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

Anmärkningar

Väntetyp

När sp_invoke_external_rest_endpoint väntar på att anropet till den anropade tjänsten ska slutföras rapporterar det en HTTP_EXTERNAL_CONNECTION väntetyp.

HTTPS och TLS

Endast slutpunkter som är konfigurerade att använda HTTPS med TLS-krypteringsprotokoll stöds.

HTTP-omdirigeringar

sp_invoke_external_rest_endpoint följer inte automatiskt någon HTTP-omdirigering som tas emot som ett svar från den anropade slutpunkten.

HTTP-huvuden

sp_invoke_external_rest_endpoint matar automatiskt in följande huvuden i HTTP-begäran:

  • innehållstyp: inställd på application/json; charset=utf-8
  • acceptera: inställd på application/json
  • : ange <EDITION>/<PRODUCT VERSION> till exempel: SQL Azure/12.0.2000.8

Även om alltid skrivs över av den lagrade proceduren kan innehållstyp och acceptera huvudvärden vara användardefinierade via parametern @headers. Endast medietypsdirektivet tillåts anges i innehållstypen och det går inte att ange teckenuppsättningen eller gränsdirektiven.

Nyttolast för begäran och svar som stöds medietyper

Följande är godkända värden för rubriken innehållstyp.

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

För accepterar sidhuvud är följande godkända värden.

  • application/json
  • application/xml
  • SMS/*

Mer information om texthuvudtyper finns i registret texttyp i IANA.

Not

Om du testar anrop av REST-slutpunkten med andra verktyg, till exempel cURL- eller någon modern REST-klient som Insomnia, måste du inkludera samma huvuden som matas in automatiskt av sp_invoke_external_rest_endpoint för att få samma beteende och resultat.

Metodtips

Använda en batchteknik

Om du måste skicka en uppsättning rader till en REST-slutpunkt, till exempel till en Azure-funktion eller till en händelsehubb, rekommenderar vi att du batchar raderna i ett enda JSON-dokument för att undvika HTTPS-anropskostnaderna för varje rad som skickas. Detta kan göras med hjälp av FOR JSON-instruktionen, till exempel:

-- 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 INT,
    @response AS NVARCHAR(MAX);

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

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

Exempel

Här hittar du några exempel på hur du använder sp_invoke_external_rest_endpoint för att integrera med vanliga Azure-tjänster som Azure Functions eller Azure Event Hubs. Fler exempel för att integrera med andra tjänster finns på GitHub-.

A. Anropa en Azure-funktion med en HTTP-utlösarbindning utan autentisering

I följande exempel anropas en Azure-funktion med hjälp av en HTTP-utlösarbindning som tillåter anonym åtkomst.

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

EXEC @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. Anropa en Azure-funktion med en HTTP-utlösarbindning med en auktoriseringsnyckel

I följande exempel anropas en Azure-funktion med en HTTP-utlösarbindning som konfigurerats för att kräva en auktoriseringsnyckel. Auktoriseringsnyckeln skickas i x-function-key-huvudet enligt vad som krävs av Azure Functions. Mer information finns i Azure Functions – API-nyckelauktorisering.

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 INT, @response NVARCHAR(MAX);

EXEC @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. Läsa innehållet i en fil från Azure Blob Storage med en SAS-token

I det här exemplet läss en fil från Azure Blob Storage med hjälp av en SAS-token för autentisering. Resultatet returneras i XML, så du behöver använda rubriken "Accept":"application/xml".

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

EXEC @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. Skicka ett meddelande till en händelsehubb med azure SQL Database Managed Identity

Det här exemplet visar hur du kan skicka meddelanden till Event Hubs med hjälp av Azure SQL Managed Identity. Kontrollera att du har konfigurerat systemhanterad identitet för den logiska Azure SQL Database-servern som är värd för databasen, till exempel:

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

Därefter konfigurerar du Event Hubs så att Azure SQL Server hanterad identitet kan skicka meddelanden ("Azure Event Hubs Data Sender"-roll) till önskad händelsehubb. Mer information finns i Använda händelsehubbar med hanterade identiteter.

När detta är klart kan du använda identitetsnamnet Managed Identity när du definierar databasens begränsade autentiseringsuppgifter som ska användas av sp_invoke_external_rest_endpoint. Som beskrivs i Autentisera ett program med Microsoft Entra-ID för att få åtkomst till Event Hubs-resurserär resursnamnet (eller ID:t) som ska användas när du använder Microsoft Entra-autentisering 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 UNIQUEIDENTIFIER = NEWID();
DECLARE @payload NVARCHAR(MAX) = (
        SELECT *
        FROM (
            VALUES (@Id, 'John', 'Doe')
            ) AS UserTable(UserId, FirstName, LastName)
        FOR JSON AUTO,
            WITHOUT_ARRAY_WRAPPER
        )
DECLARE @url NVARCHAR(4000) = 'https://<EVENT-HUBS-NAME>.servicebus.windows.net/from-sql/messages';
DECLARE @headers NVARCHAR(4000) = N'{"BrokerProperties": "' + STRING_ESCAPE('{"PartitionKey": "' + CAST(@Id AS NVARCHAR(36)) + '"}', 'json') + '"}'
DECLARE @ret INT, @response NVARCHAR(MAX);

EXEC @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. Läsa och skriva en fil till Azure File Storage med autentiseringsuppgifter för Azure SQL Database

Det här exemplet skriver en fil till en Azure File Storage med en Azure SQL Database-omfångsautentisering för autentisering och returnerar sedan innehållet. Resultatet returneras i XML, så du behöver använda rubriken "Accept":"application/xml".

Börja med att skapa en huvudnyckel för Azure SQL Database

create master key encryption by password = '2112templesmlm2BTS21.qwqw!@0dvd'
go

Skapa sedan autentiseringsuppgifterna för databasen med hjälp av SAS-token som tillhandahålls av Azure Blob Storage-kontot.

create database scoped credential [filestore]
with identity='SHARED ACCESS SIGNATURE',
secret='sv=2022-11-02&ss=bfqt&srt=sco&sp=seespotrun&se=2023-08-03T02:21:25Z&st=2023-08-02T18:21:25Z&spr=https&sig=WWwwWWwwWWYaKCheeseNXCCCCCCDDDDDSSSSSU%3D'
go

Skapa sedan filen och lägg till text i den med följande två instruktioner:

declare @payload nvarchar(max) = (select * from (values('Hello from Azure SQL!', sysdatetime())) payload([message], [timestamp])for json auto, without_array_wrapper)
declare @response nvarchar(max), @url nvarchar(max), @headers nvarchar(1000);
declare @len int = len(@payload)

-- Create the File
set @url = 'https://myfiles.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')
exec 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://myfiles.file.core.windows.net/myfiles/test-me-from-azure-sql.json'
set @url += '?comp=range'
exec sp_invoke_external_rest_endpoint
    @url = @url,
    @method = 'PUT',
    @headers = @headers,
    @payload = @payload,
    @credential = [filestore],
    @response = @response output
select cast(@response as xml)
go

Använd slutligen följande instruktion för att läsa filen

declare @response nvarchar(max);
declare @url nvarchar(max) = 'https://myfiles.file.core.windows.net/myfiles/test-me-from-azure-sql.json'
exec sp_invoke_external_rest_endpoint
    @url = @url,
    @headers = '{"Accept":"application/xml"}',
    @credential = [filestore],
    @method = 'GET',
    @response = @response output
select cast(@response as xml)
go