Sdílet prostřednictvím


sp_invoke_external_rest_endpoint (Transact-SQL)

platí pro:databáze AZURE SQL DatabaseSQL v Microsoft Fabric

Uložená procedura sp_invoke_external_rest_endpoint vyvolá koncový bod REST HTTPS zadaný jako vstupní argument procedury.

Syntax

Transact-SQL konvence syntaxe

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 ]

Argumenty

[ @url = ] N'url'

Adresa URL koncového bodu HTTPS REST, který se má volat. @url je nvarchar(4000) bez výchozího nastavení.

[ @payload = ] N'request_payload'

Řetězec Unicode ve formátu JSON, XML nebo TEXT, který obsahuje datovou část pro odeslání do koncového bodu REST HTTPS. Datové části musí být platný dokument JSON, dokument XML ve správném formátu nebo text. @payload je nvarchar(max) bez výchozího nastavení.

[ @headers = ] HlavičkyN

Hlavičky, které se musí odeslat jako součást požadavku do koncového bodu REST HTTPS. Hlavičky musí být zadány pomocí plochého formátu JSON (dokument JSON bez vnořených struktur). Hlavičky definované v seznamu Název zakázaných hlaviček budou ignorovány, i když explicitně předané v parametru @headers; jejich hodnoty budou při spuštění požadavku HTTPS zahozeny nebo nahrazeny hodnotami zadanými systémem.

Parametr @headers je nvarchar(4000) bez výchozího nastavení.

[ @method = ] N' metoda'

Metoda HTTP pro volání adresy URL. Musí to být jedna z následujících hodnot: GET, POST, PUT, PATCH, DELETE, HEAD. @method je nvarchar(6) s POST jako výchozí hodnotou.

[ @timeout = ] sekund

Doba v sekundách povolená pro spuštění volání HTTPS Pokud se během definovaného časového limitu v sekundách nedá odeslat a přijímat úplné požadavky HTTP a odpověď, zastaví se spuštění uložené procedury a vyvolá se výjimka. Časový limit začíná, když se spustí připojení HTTP a skončí, když byla přijata odpověď a datová část zahrnutá, pokud existuje. @timeout je pozitivní smallint s výchozí hodnotou 30. Přijaté hodnoty: 1 až 230.

[ @credential = ] přihlašovacích údajů

Určuje, který objekt CREDENTIAL OBORU DATABÁZE se používá k vložení ověřovacích údajů do požadavku HTTPS. @credential je sysname bez výchozí hodnoty.

výstup @response

Povolte předání odpovědi přijaté z volané koncového bodu do zadané proměnné. @response je nvarchar(max).

Návratová hodnota

Provedení vrátí 0, pokud bylo volání HTTPS provedeno a přijatý stavový kód HTTP je stavový kód 2xx (Success). Pokud přijatý stavový kód HTTP není v rozsahu 2xx, návratová hodnota bude přijatý stavový kód HTTP. Pokud volání HTTPS nejde vůbec provést, vyvolá se výjimka.

Dovolení

Vyžaduje spuštění libovolného oprávnění k databázi EXTERNÍHO KONCOVÉHO BODU.

Například:

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

Formát odpovědi

Odpověď volání HTTP a výsledná data odesílaná zpět vyvolaný koncový bod jsou k dispozici prostřednictvím výstupního parametru @response. @response může obsahovat dokument JSON s následujícím schématem:

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

Specificky:

  • odpověď: objekt JSON, který obsahuje výsledek HTTP a další metadata odpovědi.
  • výsledek: datová část JSON vrácená voláním HTTP. Vynechá se, pokud je přijatý výsledek HTTP 204 (No Content).

Nebo @response může obsahovat dokument XML s následujícím schématem:

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

Specificky:

  • odpověď: objekt XML, který obsahuje výsledek HTTP a další metadata odpovědi.
  • výsledek: datová část XML vrácená voláním HTTP. Vynechá se, pokud je přijatý výsledek HTTP 204 (No Content).

V response části se kromě stavového kódu a popisu HTTP zobrazí celá sada přijatých hlaviček odpovědi v headers objektu. Následující příklad ukazuje oddíl response ve formátu JSON (také struktura pro textové odpovědi):

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

Následující příklad ukazuje oddíl response v jazyce 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>

Povolené koncové body

Jsou povolena pouze volání koncových bodů v následujících službách:

Služba Azure Doména
Azure Functions *.azurewebsites.net
Služba Azure Apps *.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 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
Soubory Azure *.file.core.windows.net
Azure Queue Storage *.queue.core.windows.net
Azure Table Storage *.table.core.windows.net
Azure Communication Services *.communications.azure.com
Vyhledávání Bingem 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

pravidla odchozí brány firewall pro službu Azure SQL Database a Azure Synapse Analytics kontrolní mechanismus je možné použít k dalšímu omezení odchozího přístupu k externím koncovým bodům.

Poznámka

Pokud chcete vyvolat službu REST, která není v seznamu povolených, můžete pomocí služby API Management bezpečně zveřejnit požadovanou službu a zpřístupnit ji sp_invoke_external_rest_endpoint.

Hranice

Velikost datové části

Datová část, při přijetí i při odeslání, má kódování UTF-8 při odesílání přes drát. V takovém formátu je jeho velikost omezená na 100 MB.

Délka adresy URL

Maximální délka adresy URL (vygenerovaná po použití parametru @url a přidání zadaných přihlašovacích údajů do řetězce dotazu( pokud existuje) je 8 kB; Maximální délka řetězce dotazu (řetězec dotazu + řetězec dotazu) je 4 kB.

Velikost záhlaví

Maximální velikost hlavičky požadavku a odpovědi (všechna pole hlaviček: hlavičky předávané prostřednictvím @headers parametru + hlavičky přihlašovacích údajů + systémové hlavičky) je 8 kB.

Škrcení

Počet souběžných připojení k externím koncovým bodům provedeným prostřednictvím sp_invoke_external_rest_endpoint je omezený na 10% pracovních vláken s maximálně 150 pracovními procesy. U jednoúčelové databáze omezování se vynucuje na úrovni databáze, zatímco u elastického fondu se omezování vynucuje na úrovni databáze i na úrovni fondu.

Pokud chcete zkontrolovat, kolik souběžných připojení může databáze udržovat, spusťte následující dotaz:

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

Pokud se při dosažení maximálního počtu souběžných připojení pokusí nové připojení k externímu koncovému bodu pomocí sp_invoke_external_rest_endpoint, vyvolá se chyba 10928 (nebo 10936, pokud jste dosáhli limitů elastických fondů). Například:

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.

Pověření

Některé koncové body REST vyžadují ověření, aby se správně vyvolalo. Ověřování je obvykle možné provést předáním některých párů klíč-hodnota v řetězci dotazu nebo v hlavičkách HTTP nastavených pomocí požadavku.

K bezpečnému ukládání ověřovacích dat (jako je například nosný token) sp_invoke_external_rest_endpoint k volání chráněného koncového bodu je možné použít PŘIHLAŠOVACÍ ÚDAJE S OBOREM DATABÁZE. Při vytváření POVĚŘENÍ SCOPED DATABASE použijte parametr IDENTITY k určení, jaká ověřovací data se předají do vyvolaného koncového bodu a jak. IDENTITa podporuje čtyři možnosti:

  • : Odeslání zadaných ověřovacích dat pomocí hlaviček požadavků
  • : Odeslání zadaných ověřovacích dat pomocí řetězce dotazu
  • Managed Identity: Pomocí hlaviček požadavku odešlete spravovanou identitu přiřazenou systémem .
  • Shared Access Signature: poskytnutí omezeného delegovaného přístupu k prostředkům prostřednictvím podepsané adresy URL (označované také jako SAS)

Vytvořený PARAMETR DATABASE SCOPED CREDENTIAL lze použít prostřednictvím parametru @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>]

S touto hodnotou IDENTITY se přihlašovací údaje DATABASE SCOPED přidají do hlaviček požadavku. Dvojice klíč-hodnota obsahující ověřovací informace musí být poskytována prostřednictvím parametru SECRET pomocí plochého formátu JSON. Například:

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

Pravidla názvu přihlašovacích údajů

Vytvořené POVĚŘENÍ DATABASE SCOPED MUSÍ dodržovat konkrétní pravidla, aby bylo možné je používat s sp_invoke_external_rest_endpoint. Pravidla jsou následující:

  • Musí to být platná adresa URL.
  • Doména adresy URL musí být jednou z těchto domén zahrnutých v seznamu povolených.
  • Adresa URL nesmí obsahovat řetězec dotazu.
  • Protokol + plně kvalifikovaný název domény (FQDN) volané adresy URL se musí shodovat s protokolem a plně kvalifikovaným názvem domény názvu přihlašovacích údajů.
  • Každá část pojmenované cesty URL se musí zcela shodovat s odpovídající částí cesty URL v názvu přihlašovacích údajů.
  • Přihlašovací údaje musí odkazovat na cestu, která je obecnější než adresa URL požadavku. Například přihlašovací údaje vytvořené pro cestu https://northwind.azurewebsite.net/customers nejde použít pro adresu URL https://northwind.azurewebsite.net

Pravidla kolace a názvu přihlašovacích údajů

RFC 3986 Oddíl 6.2.2.1 uvádí, že "Pokud identifikátor URI používá součásti obecné syntaxe, pravidla ekvivalence syntaxe součástí vždy platí; a sice, že režim a hostitel nerozlišují malá a velká písmena" a RFC 7230 Oddíl 2.7.3 uvádí, že "všechny ostatní se porovnávají způsobem citlivým na malá a velká písmena".

Vzhledem k tomu, že na úrovni databáze existuje sada pravidel kolace, použije se následující logika, která bude koherentní s pravidlem kolace databáze a výše uvedeným dokumentem RFC. (Popsané pravidlo může být potenciálně více omezující než pravidla RFC, například pokud je databáze nastavena tak, aby používala kolaci s rozlišováním velkých a malých písmen.):

  1. Pomocí dokumentu RFC zkontrolujte, jestli se adresa URL a přihlašovací údaje shodují. To znamená:
    • Zkontrolujte schéma a hostitele pomocí kolace nerozlišující malá a velká písmena (Latin1_General_100_CI_AS_KS_WS_SC).
    • Zkontrolujte porovnání všech ostatních segmentů adresy URL v kolaci s rozlišováním velkých a malých písmen (Latin1_General_100_BIN2).
  2. Pomocí pravidel kolace databáze (a bez kódování adresy URL) zkontrolujte, jestli se adresa URL a přihlašovací údaje shodují.

Udělení oprávnění k používání přihlašovacích údajů

Uživatelé databáze, kteří přistupují k přihlašovacím údajům OBORU DATABÁZE, musí mít oprávnění k použití tohoto pověření.

Aby mohl uživatel databáze používat přihlašovací údaje, musí mít oprávnění REFERENCES ke konkrétním přihlašovacím údajům:

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

Poznámky

Typ čekání

Když sp_invoke_external_rest_endpoint čeká na dokončení volání vyvolané služby, nahlásí HTTP_EXTERNAL_CONNECTION typ čekání.

HTTPS a TLS

Podporují se jenom koncové body, které jsou nakonfigurované tak, aby používaly protokol HTTPS s šifrovacím protokolem TLS.

Přesměrování HTTP

sp_invoke_external_rest_endpoint nebude automaticky sledovat žádné přesměrování HTTP přijaté jako odpověď z vyvolané koncového bodu.

Hlavičky HTTP

sp_invoke_external_rest_endpoint automaticky vloží do požadavku HTTP následující hlavičky:

  • typu obsahu: je nastavená na application/json; charset=utf-8
  • přijmout: nastaveno na application/json
  • uživatelského agenta: nastavte <EDITION>/<PRODUCT VERSION> například: SQL Azure/12.0.2000.8

I když se uživatelského agenta vždy přepíšou uloženou procedurou, typ obsahu a přijímat hodnoty hlaviček mohou být uživatelem definované pomocí parametru @headers. V typu obsahu je povolena pouze direktiva typu média a zadání direktiv charset nebo hranic není možné.

Podporovaná datová část požadavku a odpovědi typů médií

Níže jsou přijaty hodnoty hlavičky typ obsahu.

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

Pro přijmout záhlaví jsou následující hodnoty.

  • application/json
  • application/xml
  • Text/*

Další informace o typech záhlaví textu najdete v registru textového typu na adrese IANA.

Poznámka

Pokud testujete vyvolání koncového bodu REST s jinými nástroji, například cURL nebo jakéhokoli moderního klienta REST, jako je režimu spánku , nezapomeňte zahrnout stejné hlavičky, které se automaticky vloží sp_invoke_external_rest_endpoint, aby měly stejné chování a výsledky.

Osvědčené postupy

Použití techniky dávkování

Pokud potřebujete odeslat sadu řádků do koncového bodu REST, například do funkce Azure Nebo do centra událostí, doporučujeme řádky dávkovat do jednoho dokumentu JSON, aby se zabránilo režii volání HTTPS pro každý řádek odesílaný. Můžete to provést pomocí příkazu FOR JSON, například:

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

Příklady

Tady najdete několik příkladů použití sp_invoke_external_rest_endpoint k integraci s běžnými službami Azure, jako jsou Azure Functions nebo Azure Event Hubs. Další ukázky pro integraci s dalšími službami najdete na GitHubu .

A. Volání funkce Azure Functions pomocí vazby triggeru HTTP bez ověřování

Následující příklad volá funkci Azure Functions pomocí vazby triggeru HTTP umožňující anonymní přístup.

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. Volání funkce Azure Functions pomocí vazby triggeru HTTP s autorizačním klíčem

Následující příklad volá funkci Azure Functions pomocí vazby triggeru HTTP nakonfigurované tak, aby vyžadovala autorizační klíč. Autorizační klíč se předá v hlavičce x-function-key podle požadavků služby Azure Functions. Další informace najdete v tématu Azure Functions – autorizace klíče rozhraní 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 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. Čtení obsahu souboru ze služby Azure Blob Storage pomocí tokenu SAS

Tento příklad načte soubor ze služby Azure Blob Storage pomocí tokenu SAS pro ověřování. Výsledky se vrátí ve formátu XML, takže bude potřeba použít hlavičku "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. Odeslání zprávy do centra událostí pomocí spravované identity Azure SQL Database

Tato ukázka ukazuje, jak můžete odesílat zprávy do služby Event Hubs pomocí spravované identity Azure SQL. Ujistěte se, že jste nakonfigurovali spravovanou identitu systému pro logický server Azure SQL Database, který je hostitelem vaší databáze, například:

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

Potom nakonfigurujte službu Event Hubs tak, aby spravovaná identita Azure SQL Serveru mohla odesílat zprávy (role Odesílatel dat služby Azure Event Hubs) do požadovaného centra událostí. Další informace najdete v tématu Použití služby Event Hubs se spravovanými identitami.

Jakmile to uděláte, můžete použít název Managed Identity identity při definování přihlašovacích údajů s oborem databáze, které budou používány sp_invoke_external_rest_endpoint. Jak je vysvětleno v Ověření aplikace pomocí ID Microsoft Entra pro přístup k prostředkům služby Event Hubs, název prostředku (nebo ID), který se má použít při použití ověřování Microsoft Entra, je 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. Čtení a zápis souboru do služby Azure File Storage s přihlašovacími údaji s vymezeným oborem služby Azure SQL Database

Tento příklad zapíše soubor do služby Azure File Storage pomocí přihlašovacích údajů s vymezeným oborem služby Azure SQL Database pro ověřování a vrátí obsah. Výsledky se vrátí ve formátu XML, takže bude potřeba použít hlavičku "Accept":"application/xml".

Začněte vytvořením hlavního klíče pro Azure SQL Database.

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

Pak vytvořte přihlašovací údaje s vymezeným oborem databáze pomocí tokenu SAS poskytnutého účtem služby Azure Blob Storage.

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

Dále vytvořte soubor a přidejte do něj text s následujícími dvěma příkazy:

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

Nakonec k přečtení souboru použijte následující příkaz.

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