Udostępnij za pośrednictwem


sp_invoke_external_rest_endpoint (Transact-SQL)

Dotyczy:usługi Azure SQL DatabaseSQL Database w usłudze Microsoft Fabric

Procedura składowana sp_invoke_external_rest_endpoint wywołuje punkt końcowy REST PROTOKOŁU HTTPS podany jako argument wejściowy procedury.

Składnia

Transact-SQL konwencje składni

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'

Adres URL punktu końcowego REST PROTOKOŁU HTTPS, który ma być wywoływany. @url jest nvarchar(4000) bez wartości domyślnej.

[ @payload = ] N'request_payload'

Ciąg Unicode w formacie JSON, XML lub TEXT zawierający ładunek do wysłania do punktu końcowego REST HTTPS. Ładunki muszą być prawidłowym dokumentem JSON, dobrze sformułowanym dokumentem XML lub tekstem. @payload nvarchar(max) bez wartości domyślnej.

[ @headers = ] Nagłówki N'"

Nagłówki, które muszą być wysyłane jako część żądania do punktu końcowego REST protokołu HTTPS. Nagłówki muszą być określone przy użyciu prostego formatu JSON (dokumentu JSON bez zagnieżdżonych struktur). Nagłówki zdefiniowane w nazwie Zabronione nagłówki będą ignorowane, nawet jeśli jawnie przekazano w parametrze @headers; ich wartości zostaną odrzucone lub zastąpione wartościami dostarczonymi przez system podczas uruchamiania żądania HTTPS.

Parametr @headers jest nvarchar(4000) bez wartości domyślnej.

[ @method = ] N'method'

Metoda HTTP do wywoływania adresu URL. Musi być jedną z następujących wartości: GET, POST, PUT, PATCH, DELETE, HEAD. @method nvarchar(6) z wartością domyślną POST.

[ @timeout = ] sekund

Czas w sekundach dozwolony dla uruchomienia wywołania HTTPS. Jeśli pełne żądanie HTTP i odpowiedź nie mogą być wysyłane i odbierane w ramach zdefiniowanego limitu czasu w sekundach, wykonywanie procedury składowanej zostanie zatrzymane i zostanie zgłoszony wyjątek. Limit czasu rozpoczyna się po uruchomieniu i zakończeniu połączenia HTTP, gdy odpowiedź i ładunek uwzględniony, jeśli istnieje, został odebrany. @timeout jest dodatnim smallint z wartością domyślną 30. Zaakceptowane wartości: od 1 do 230.

[ @credential = ] poświadczeń

Określ, który obiekt CREDENTIAL o zakresie bazy danych jest używany do wstrzykiwania informacji uwierzytelniania w żądaniu HTTPS. @credential jest nazwa_systemu bez wartości domyślnej.

dane wyjściowe @response

Zezwalaj na przekazanie odpowiedzi odebranej z wywoływanego punktu końcowego do określonej zmiennej. @response to nvarchar(max).

Wartość zwracana

Wykonanie zwróci 0, jeśli wykonano wywołanie HTTPS, a otrzymany kod stanu HTTP to kod stanu 2xx (Success). Jeśli otrzymany kod stanu HTTP nie znajduje się w zakresie 2xx, zwracana wartość będzie kodem stanu HTTP otrzymany. Jeśli w ogóle nie można wykonać wywołania HTTPS, zostanie zgłoszony wyjątek.

Uprawnienia

Wymaga uprawnień DO WYKONYWANIA DOWOLNEJ ZEWNĘTRZNEJ bazy danych PUNKTU KOŃCOWEGO.

Na przykład:

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

Format odpowiedzi

Odpowiedź wywołania HTTP i wynikowe dane wysyłane z powrotem przez wywołany punkt końcowy są dostępne za pośrednictwem parametru wyjściowego @response. @response może zawierać dokument JSON z następującym schematem:

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

Specyficznie:

  • odpowiedzi: obiekt JSON zawierający wynik HTTP i inne metadane odpowiedzi.
  • wynik: ładunek JSON zwrócony przez wywołanie HTTP. Pominięto, jeśli otrzymany wynik HTTP to 204 (No Content).

Lub @response może zawierać dokument XML z następującym schematem:

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

Specyficznie:

  • odpowiedzi: obiekt XML zawierający wynik HTTP i inne metadane odpowiedzi.
  • wynik: ładunek XML zwrócony przez wywołanie HTTP. Pominięto, jeśli otrzymany wynik HTTP to 204 (No Content).

W sekcji response oprócz kodu stanu HTTP i opisu cały zestaw odebranych nagłówków odpowiedzi zostanie udostępniony w obiekcie headers. Poniższy przykład przedstawia sekcję response w formacie JSON (także strukturę odpowiedzi tekstowych):

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

W poniższym przykładzie przedstawiono sekcję response w pliku 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>

Dozwolone punkty końcowe

Dozwolone są tylko wywołania punktów końcowych w następujących usługach:

Usługa platformy Azure Domena
Azure Functions *.azurewebsites.net
Usługa Azure Apps *.azurewebsites.net
Środowisko usługi Azure App Service *.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
Wyszukiwanie Bing 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

reguł zapory ruchu wychodzącego dla usług Azure SQL Database i Azure Synapse Analytics mechanizm kontroli może służyć do dalszego ograniczania dostępu wychodzącego do zewnętrznych punktów końcowych.

Nuta

Jeśli chcesz wywołać usługę REST, która nie znajduje się na liście dozwolonych, możesz bezpiecznie uwidocznić żądaną usługę i udostępnić ją sp_invoke_external_rest_endpoint.

Limity

Rozmiar ładunku

Ładunek, zarówno w przypadku odebrania, jak i wysłania, jest zakodowany w formacie UTF-8 podczas wysyłania za pośrednictwem przewodu. W tym formacie jego rozmiar jest ograniczony do 100 MB.

Długość adresu URL

Maksymalna długość adresu URL (wygenerowana po użyciu parametru @url i dodanie określonych poświadczeń do ciągu zapytania, jeśli istnieje) wynosi 8 KB; maksymalna długość ciągu zapytania (ciąg zapytania i ciąg zapytania poświadczeń) wynosi 4 KB.

Rozmiar nagłówków

Maksymalny rozmiar nagłówka żądania i odpowiedzi (wszystkie pola nagłówka: nagłówki przekazywane za pośrednictwem @headers parametru + nagłówka poświadczeń + dostarczone nagłówki systemu) to 8 KB.

Dławienie

Liczba równoczesnych połączeń z zewnętrznymi punktami końcowymi wykonywana za pośrednictwem sp_invoke_external_rest_endpoint jest ograniczona do 10% wątków roboczych, z maksymalnie 150 procesami roboczymi. W przypadku pojedynczej bazy danych ograniczanie jest wymuszane na poziomie bazy danych, podczas gdy na elastycznej puli ograniczanie jest wymuszane zarówno na poziomie bazy danych, jak i na poziomie puli.

Aby sprawdzić, ile równoczesnych połączeń może utrzymać baza danych, uruchom następujące zapytanie:

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

Jeśli nowe połączenie z zewnętrznym punktem końcowym przy użyciu sp_invoke_external_rest_endpoint zostanie wypróbowane po osiągnięciu maksymalnej liczby współbieżnych połączeń, zostanie zgłoszony błąd 10928 (lub 10936, jeśli osiągnięto limity pul elastycznych). Na przykład:

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.

Poświadczenia

Niektóre punkty końcowe REST wymagają uwierzytelniania w celu poprawnego wywołania. Uwierzytelnianie można zwykle wykonać, przekazując niektóre określone pary klucz-wartość w ciągu zapytania lub w nagłówkach HTTP ustawionych za pomocą żądania.

Za pomocą poświadczeń ZAKRESU BAZY danych można bezpiecznie przechowywać dane uwierzytelniania (na przykład token elementu nośnego) do używania przez sp_invoke_external_rest_endpoint do wywoływania chronionego punktu końcowego. Podczas tworzenia POŚWIADCZEŃ O ZAKRESIE BAZY DANYCH użyj parametru IDENTITY, aby określić, jakie dane uwierzytelniania zostaną przekazane do wywoływanego punktu końcowego i jak. Usługa IDENTITY obsługuje cztery opcje:

  • HTTPEndpointHeaders: wysyłanie określonych danych uwierzytelniania przy użyciu nagłówków żądań
  • : wysyłanie określonych danych uwierzytelniania przy użyciu ciągu zapytania
  • : wyślij tożsamości zarządzanej przypisanej przez system przy użyciu nagłówków żądania
  • Shared Access Signature: zapewniają ograniczony delegowany dostęp do zasobów za pośrednictwem podpisanego adresu URL (nazywanego również sygnaturą dostępu współdzielonego)

utworzone POŚWIADCZENIE O ZAKRESIE BAZY DANYCH można użyć za pomocą 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>]

Przy użyciu tej wartości IDENTITY do nagłówków żądania zostaną dodane POŚWIADCZENIA O ZAKRESIE BAZY DANYCH. Para klucz-wartość zawierająca informacje uwierzytelniania musi być podana za pośrednictwem parametru SECRET przy użyciu płaskiego formatu JSON. Na przykład:

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

Reguły nazw poświadczeń

Utworzone POŚWIADCZENIE O ZAKRESIE BAZY DANYCH musi być zgodne z określonymi regułami, aby można było ich używać z sp_invoke_external_rest_endpoint. Reguły są następujące:

  • Musi być prawidłowym adresem URL
  • Domena adresu URL musi być jedną z tych domen uwzględnionych na liście dozwolonych
  • Adres URL nie może zawierać ciągu zapytania
  • Protokół + w pełni kwalifikowana nazwa domeny (FQDN) wywoływanego adresu URL musi być zgodna z protokołem i nazwą FQDN nazwy poświadczeń
  • Każda część wywoływanej ścieżki adresu URL musi być całkowicie zgodna z odpowiednią częścią ścieżki adresu URL w nazwie poświadczeń
  • Poświadczenie musi wskazywać ścieżkę, która jest bardziej ogólna niż adres URL żądania. Na przykład nie można użyć poświadczeń utworzonych dla ścieżki https://northwind.azurewebsite.net/customers dla adresu URL https://northwind.azurewebsite.net

Reguły sortowania i nazw poświadczeń

RFC 3986 Sekcja 6.2.2.1 stwierdza, że "Gdy identyfikator URI używa składników składni ogólnej, reguły równoważności składni składników są zawsze stosowane; a mianowicie, że schemat i host są bez uwzględniania wielkości liter" i RFC 7230 Sekcja 2.7.3 wspomina, że "wszystkie inne są porównywane w sposób uwzględniający wielkość liter".

Ponieważ na poziomie bazy danych ustawiono regułę sortowania, zostanie zastosowana następująca logika, aby była spójna z regułą sortowania bazy danych i specyfikacją RFC wymienioną powyżej. (Opisana reguła może być potencjalnie bardziej restrykcyjna niż reguły RFC, na przykład jeśli baza danych ma używać sortowania uwzględniającego wielkość liter).

  1. Sprawdź, czy adres URL i poświadczenia są zgodne przy użyciu specyfikacji RFC, co oznacza:
    • Sprawdź schemat i host przy użyciu sortowania bez uwzględniania wielkości liter (Latin1_General_100_CI_AS_KS_WS_SC)
    • Sprawdź, czy wszystkie inne segmenty adresu URL są porównywane w sortowaniu uwzględniającym wielkość liter (Latin1_General_100_BIN2)
  2. Sprawdź, czy adres URL i poświadczenia są zgodne przy użyciu reguł sortowania bazy danych (i bez kodowania adresu URL).

Udzielanie uprawnień do używania poświadczeń

Użytkownicy bazy danych, którzy uzyskują dostęp do POŚWIADCZENIA W ZAKRESIE BAZY DANYCH, muszą mieć uprawnienia do używania tego poświadczenia.

Aby użyć poświadczeń, użytkownik bazy danych musi mieć REFERENCES uprawnienia do określonego poświadczenia:

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

Uwagi

Typ oczekiwania

Gdy sp_invoke_external_rest_endpoint oczekuje na zakończenie wywołania wywoływanej usługi, zgłosi HTTP_EXTERNAL_CONNECTION typ oczekiwania.

Protokoły HTTPS i TLS

Obsługiwane są tylko punkty końcowe skonfigurowane do używania protokołu HTTPS z protokołem szyfrowania TLS.

Przekierowania HTTP

sp_invoke_external_rest_endpoint nie będzie automatycznie śledzić żadnego przekierowania HTTP odebranego jako odpowiedzi z wywołanego punktu końcowego.

Nagłówki HTTP

sp_invoke_external_rest_endpoint automatycznie wstrzykuje następujące nagłówki w żądaniu HTTP:

  • typu zawartości: ustaw wartość application/json; charset=utf-8
  • zaakceptować: ustaw wartość na application/json
  • agenta użytkownika: ustaw <EDITION>/<PRODUCT VERSION> na przykład: SQL Azure/12.0.2000.8

Chociaż agenta użytkownika będzie zawsze zastępowany przez procedurę składowaną, typ zawartości i akceptują wartości nagłówków mogą być definiowane przez użytkownika za pośrednictwem parametru @headers. Tylko dyrektywa typu nośnika może być określona w typie zawartości i określenie dyrektyw charset lub granic nie jest możliwe.

Ładunki żądań i odpowiedzi obsługiwane typów multimediów

Poniżej są akceptowane wartości nagłówka typu zawartości.

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

W przypadku zaakceptuj nagłówek są akceptowane wartości.

  • application/json
  • aplikacja/xml
  • Tekst/*

Aby uzyskać więcej informacji na temat typów nagłówków tekstu, zapoznaj się z rejestrem typów tekstu w witrynie IANA.

Nuta

Jeśli testujesz wywołanie punktu końcowego REST za pomocą innych narzędzi, takich jak cURL lub dowolny nowoczesny klient REST, taki jak bezsenność, upewnij się, że dołącz te same nagłówki, które są automatycznie wstrzykiwane przez sp_invoke_external_rest_endpoint, aby mieć takie samo zachowanie i wyniki.

Najlepsze rozwiązania

Używanie techniki przetwarzania wsadowego

Jeśli musisz wysłać zestaw wierszy do punktu końcowego REST, na przykład do funkcji platformy Azure lub centrum zdarzeń, zaleca się dzielenie wierszy na pojedynczy dokument JSON, aby uniknąć obciążenia wywołania HTTPS dla każdego wysłanego wiersza. Można to zrobić przy użyciu instrukcji FOR JSON, na przykład:

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

Przykłady

Tutaj można znaleźć kilka przykładów dotyczących sposobu używania sp_invoke_external_rest_endpoint do integracji z typowymi usługami platformy Azure, takimi jak Azure Functions lub Azure Event Hubs. Więcej przykładów do integracji z innymi usługami można znaleźć w witrynie GitHub.

A. Wywoływanie funkcji platformy Azure przy użyciu powiązania wyzwalacza HTTP bez uwierzytelniania

Poniższy przykład wywołuje funkcję platformy Azure przy użyciu powiązania wyzwalacza HTTP umożliwiającego dostęp anonimowy.

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. Wywoływanie funkcji platformy Azure przy użyciu powiązania wyzwalacza HTTP z kluczem autoryzacji

Poniższy przykład wywołuje funkcję platformy Azure przy użyciu powiązania wyzwalacza HTTP skonfigurowanego do wymagania klucza autoryzacji. Klucz autoryzacji zostanie przekazany w nagłówku x-function-key zgodnie z wymaganiami usługi Azure Functions. Aby uzyskać więcej informacji, zobacz Azure Functions — autoryzacja klucza interfejsu 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. Odczytywanie zawartości pliku z usługi Azure Blob Storage przy użyciu tokenu SAS

W tym przykładzie odczytuje plik z usługi Azure Blob Storage przy użyciu tokenu SAS na potrzeby uwierzytelniania. Wyniki zostaną zwrócone w formacie XML, więc będzie potrzebne użycie "Accept":"application/xml" nagłówka.

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. Wysyłanie komunikatu do centrum zdarzeń przy użyciu tożsamości zarządzanej usługi Azure SQL Database

W tym przykładzie pokazano, jak można wysyłać komunikaty do usługi Event Hubs przy użyciu tożsamości zarządzanej usługi Azure SQL. Upewnij się, że skonfigurowano System Managed Identity dla serwera logicznego usługi Azure SQL Database hostowania bazy danych, na przykład:

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

Następnie skonfiguruj usługę Event Hubs, aby umożliwić tożsamości zarządzanej programu Azure SQL Server wysyłanie komunikatów ("Rola nadawcy danych usługi Azure Event Hubs") do żądanego centrum zdarzeń. Aby uzyskać więcej informacji, zobacz Używanie usługi Event Hubs z tożsamościami zarządzanymi.

Po wykonaniu tej czynności można użyć nazwy tożsamości Managed Identity podczas definiowania poświadczeń o zakresie bazy danych, które będą używane przez sp_invoke_external_rest_endpoint. Jak wyjaśniono w Uwierzytelnij aplikację przy użyciu identyfikatora Entra firmy Microsoft w celu uzyskania dostępu do zasobów usługi Event Hubs, nazwa zasobu (lub identyfikator) używana podczas korzystania z uwierzytelniania microsoft Entra jest 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. Odczytywanie i zapisywanie pliku w usłudze Azure File Storage przy użyciu poświadczeń o zakresie usługi Azure SQL Database

W tym przykładzie plik jest zapisywany w usłudze Azure File Storage przy użyciu poświadczeń o zakresie usługi Azure SQL Database na potrzeby uwierzytelniania, a następnie zwraca zawartość. Wyniki zostaną zwrócone w formacie XML, więc będzie potrzebne użycie "Accept":"application/xml" nagłówka.

Zacznij od utworzenia klucza głównego dla usługi Azure SQL Database

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

Następnie utwórz poświadczenia o zakresie bazy danych przy użyciu tokenu SAS dostarczonego przez konto usługi 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

Następnie utwórz plik i dodaj do niego tekst za pomocą następujących dwóch instrukcji:

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

Na koniec użyj następującej instrukcji, aby odczytać plik

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