다음을 통해 공유


sp_invoke_external_rest_endpoint(Transact-SQL)

적용 대상: Azure SQL Database

저장 프로시저는 sp_invoke_external_rest_endpoint 프로시저에 대한 입력 인수로 제공된 HTTPS REST 엔드포인트를 호출합니다.

구문

Transact-SQL 구문 표기 규칙

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 ]

인수

[ @url = ] N'url'

호출할 HTTPS REST 엔드포인트의 URL입니다. @url 기본값이 없는 nvarchar(4000)입니다.

[ @payload = ] N'request_payload'

HTTPS REST 엔드포인트로 보낼 페이로드가 포함된 JSON, XML 또는 TEXT 형식의 유니코드 문자열입니다. 페이로드는 유효한 JSON 문서, 올바른 형식의 XML 문서 또는 텍스트여야 합니다. @payload 기본값이 없는 nvarchar(max)입니다.

[ @headers = ] N'headers'

요청의 일부로 HTTPS REST 엔드포인트로 보내야 하는 헤더입니다. 플랫 JSON(중첩 구조가 없는 JSON 문서) 형식을 사용하여 머리글을 지정해야 합니다. 사용할 수 없는 헤더 이름 목록에 정의된 헤더는 @headers 매개 변수에 명시적으로 전달되더라도 무시됩니다. HTTPS 요청을 시작할 때 해당 값은 삭제되거나 시스템 제공 값으로 바뀝니다.

@headers 매개 변수는 기본값이 없는 nvarchar(4000)입니다.

[ @method = ] N'method'

URL을 호출하는 HTTP 메서드입니다. 다음 값 GETHEADPOSTPUTPATCHDELETE중 하나여야 합니다. @method 기본값으로 nvarchar(6) POST 입니다.

[ @timeout = ]

HTTPS 호출을 실행할 수 있는 시간(초)입니다. 정의된 시간 제한(초) 내에 전체 HTTP 요청 및 응답을 보내고 받을 수 없는 경우 저장 프로시저 실행이 중지되고 예외가 발생합니다. 응답이 수신되었을 때 HTTP 연결이 시작되고 종료되고 포함된 페이로드가 수신되면 시간 제한이 시작됩니다. @timeout 기본값이 30인 양수 smallint입니다. 허용되는 값: 1~230

[ @credential = ] 자격 증명

HTTPS 요청에 인증 정보를 삽입하는 데 사용되는 DATABASE SCOPED CREDENTIAL 개체를 나타냅니다. @credential 기본값이 없는 sysname입니다.

@response 출력

호출된 엔드포인트에서 받은 응답을 지정된 변수에 전달하도록 허용합니다. @response nvarchar(max)입니다.

반환 값

HTTPS 호출이 완료되고 수신된 HTTP 상태 코드가 2xx 상태 코드(Success)인 경우 실행이 반환 0 됩니다. 수신된 HTTP 상태 코드가 2xx 범위에 없는 경우 반환 값은 수신된 HTTP 상태 코드가 됩니다. HTTPS 호출을 전혀 수행할 수 없는 경우 예외가 throw됩니다.

사용 권한

EXECUTE ANY EXTERNAL ENDPOINT 데이터베이스 권한이 필요합니다.

예시:

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

응답 형식

HTTP 호출 및 호출된 엔드포인트에서 다시 보낸 결과 데이터의 응답은 @response 출력 매개 변수를 통해 사용할 수 있습니다. @response 다음 스키마가 있는 JSON 문서를 포함할 수 있습니다.

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

특별한 사항

  • 응답: HTTP 결과 및 기타 응답 메타데이터를 포함하는 JSON 개체입니다.
  • 결과: HTTP 호출에서 반환된 JSON 페이로드입니다. 수신된 HTTP 결과가 204(No Content)이면 생략됩니다.

또는 @response 다음 스키마가 있는 XML 문서를 포함할 수 있습니다.

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

특별한 사항

  • 응답: HTTP 결과 및 기타 응답 메타데이터를 포함하는 XML 개체입니다.
  • 결과: HTTP 호출에서 반환된 XML 페이로드입니다. 수신된 HTTP 결과가 204(No Content)이면 생략됩니다.

response 섹션에서는 HTTP 상태 코드 및 설명을 제외하고 수신된 응답 헤더의 전체 집합이 개체에 headers 제공됩니다. 다음 예제에서는 JSON의 섹션(텍스트 응답의 구조)을 보여 response 줍니다.

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

다음 예제에서는 XML의 섹션을 response 보여줍니다.

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

허용되는 엔드포인트

다음 서비스의 엔드포인트에 대한 호출만 허용됩니다.

Azure 서비스 도메인
Azure 기능 *.azurewebsites.net
Azure 앱 서비스 *.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
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
Bing 검색 api.bing.microsoft.com
Azure Key Vault *.vault.azure.net
Azure AI 검색 *.search.windows.net
Azure Maps *.atlas.microsoft.com
Azure AI 번역기 api.cognitive.microsofttranslator.com

Azure SQL Database 및 Azure Synapse Analytics 제어 메커니즘에 대한 아웃바운드 방화벽 규칙을 사용하여 외부 엔드포인트에 대한 아웃바운드 액세스를 추가로 제한할 수 있습니다.

참고 항목

허용된 목록에 없는 REST 서비스를 호출하려는 경우 API Management를 사용하여 원하는 서비스를 안전하게 노출하고 사용할 수 있도록 할 수 있습니다 sp_invoke_external_rest_endpoint.

제한

페이로드 크기

수신 시와 전송 시 모두 페이로드는 유선으로 전송될 때 UTF-8로 인코딩됩니다. 해당 형식의 크기는 100MB로 제한됩니다.

URL 길이

최대 URL 길이(@url 매개 변수를 사용하고 지정된 자격 증명을 쿼리 문자열에 추가한 후 생성됨)는 8KB이고 최대 쿼리 문자열 길이(쿼리 문자열 + 자격 증명 쿼리 문자열)는 4KB입니다.

헤더 크기

최대 요청 및 응답 헤더 크기(모든 헤더 필드: @headers 매개 변수를 통해 전달된 헤더 + 자격 증명 헤더 + 시스템 제공 헤더)는 8KB입니다.

제한

외부 엔드포인트 sp_invoke_external_rest_endpoint 에 대한 동시 연결 수는 작업자 스레드의 10%로 제한되며 최대 150명의 작업자가 있습니다. 단일 데이터베이스에서 제한은 데이터베이스 수준에서 적용되고 탄력적 풀 제한은 데이터베이스 수준과 풀 수준에서 모두 적용됩니다.

데이터베이스가 유지할 수 있는 동시 연결 수를 확인하려면 다음 쿼리를 실행합니다.

SELECT
  [database_name],
  DATABASEPROPERTYEX(DB_NAME(), 'ServiceObjective') AS service_level_objective,
  [slo_name] as service_level_objective_long,
  [primary_group_max_outbound_connection_workers] AS max_database_outbound_connection,
  [primary_pool_max_outbound_connection_workers] AS max_pool_outbound_connection
FROM
  sys.dm_user_db_resource_governance
WHERE
  database_id = DB_ID();

최대 동시 연결에 이미 도달했을 때 외부 엔드포인트에 대한 새 연결을 시도하는 sp_invoke_external_rest_endpoint 경우 오류 10928(또는 탄력적 풀 제한에 도달한 경우 10936)이 발생합니다. 예시:

Msg 10928, Level 16, State 4, Procedure sys.sp_invoke_external_rest_endpoint_internal, Line 1 [Batch Start Line 0]
Resource ID : 1. The outbound connections limit for the database is 20 and has been reached.
See 'https://docs.microsoft.com/azure/azure-sql/database/resource-limits-logical-server' for assistance.

자격 증명

일부 REST 엔드포인트는 제대로 호출되기 위해 인증이 필요합니다. 일반적으로 쿼리 문자열 또는 요청으로 설정된 HTTP 헤더에서 특정 키-값 쌍을 전달하여 인증을 수행할 수 있습니다.

DATABASE SCOPED 자격 증명을 사용하여 보호된 엔드포인트를 호출하는 데 사용할 sp_invoke_external_rest_endpoint 인증 데이터(예: 전달자 토큰)를 안전하게 저장할 수 있습니다. DATABASE SCOPED CREDENTIAL을 만들 때 IDENTITY 매개 변수를 사용하여 호출된 엔드포인트에 전달될 인증 데이터 및 방법을 지정합니다. IDENTITY는 다음 네 가지 옵션을 지원합니다.

  • HTTPEndpointHeaders: 요청 헤더를 사용하여 지정된 인증 데이터 보내기
  • HTTPEndpointQueryString: 쿼리 문자열을 사용하여 지정된 인증 데이터 보내기
  • Managed Identity: 요청 헤더를 사용하여 시스템 할당 관리 ID 보내기
  • Shared Access Signature: 서명된 URL(SAS라고도 함)을 통해 리소스에 대한 제한된 위임된 액세스 제공

만든 DATABASE SCOPED CREDENTIAL은 @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>]

이 IDENTITY 값을 사용하면 DATABASE SCOPED CREDENTIAL이 요청 헤더에 추가됩니다. 인증 정보를 포함하는 키-값 쌍은 플랫 JSON 형식을 사용하여 SECRET 매개 변수를 통해 제공해야 합니다. 예시:

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

자격 증명 이름 규칙

만든 DATABASE SCOPED CREDENTIAL은 함께 사용 sp_invoke_external_rest_endpoint하려면 특정 규칙을 준수해야 합니다. 규칙은 다음과 같습니다.

  • 반드시 유효한 URI여야 합니다.
  • URL 도메인은 허용 목록에 포함된 도메인 중 하나여야 합니다.
  • URL에 쿼리 문자열이 포함되어서는 안됩니다.
  • 호출된 URL의 프로토콜 + FQDN(정규화된 도메인 이름)은 자격 증명 이름의 프로토콜 + FQDN과 일치해야 합니다.
  • 호출된 URL 경로의 각 부분은 자격 증명 이름에 있는 URL 경로의 각 부분과 완전히 일치해야 합니다.
  • 자격 증명은 요청 URL보다 더 일반적인 경로를 가리킵니다. 예를 들어 경로 https://northwind.azurewebsite.net/customers 에 대해 만든 자격 증명은 URL에 사용할 수 없습니다. https://northwind.azurewebsite.net

데이터 정렬 및 자격 증명 이름 규칙

RFC 3986 섹션 6.2.2.1 은 "URI가 제네릭 구문의 구성 요소를 사용하는 경우 구성 요소 구문 동등 규칙이 항상 적용됩니다. 즉, 스키마와 호스트가 대/소문자를 구분하지 않는다는 것"이고 RFC 7230 섹션 2.7.3 은 "다른 모든 항목은 대/소문자를 구분하는 방식으로 비교된다"고 언급합니다.

데이터베이스 수준에서 데이터 정렬 규칙이 설정되어 있으므로 다음 논리가 적용되어 위에서 언급한 데이터베이스 데이터 정렬 규칙 및 RFC와 일관성을 유지합니다. (예를 들어 데이터베이스가 대/소문자를 구분하는 데이터 정렬을 사용하도록 설정된 경우 설명된 규칙은 RFC 규칙보다 더 제한적일 수 있습니다.)

  1. RFC를 사용하여 URL 및 자격 증명이 일치하는지 확인합니다. 즉, 다음을 의미합니다.
    • 대/소문자를 구분하지 않는 데이터 정렬을 사용하여 구성표 및 호스트 확인(Latin1_General_100_CI_AS_KS_WS_SC)
    • URL의 다른 모든 세그먼트가 대/소문자를 구분하는 데이터 정렬에서 비교되는지 확인합니다(Latin1_General_100_BIN2).
  2. URL 및 자격 증명이 데이터베이스 데이터 정렬 규칙을 사용하여 일치하는지 확인합니다(URL 인코딩을 수행하지 않고).

자격 증명을 사용할 수 있는 권한 부여

DATABASE SCOPED CREDENTIAL에 액세스하는 데이터베이스 사용자에게는 해당 자격 증명을 사용할 수 있는 권한이 있어야 합니다.

자격 증명을 사용하려면 데이터베이스 사용자에게 특정 자격 증명에 대한 권한이 있어야 합니다 REFERENCES .

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

설명

대기 유형

호출된 서비스에 대한 호출이 완료되기를 기다리는 경우 sp_invoke_external_rest_endpoint HTTP_EXTERNAL_CONNECTION 대기 유형을 보고합니다.

HTTPS 및 TLS

TLS 1.2 암호화 프로토콜 이상이 있는 HTTPS를 사용하도록 구성된 엔드포인트만 지원됩니다.

HTTP 리디렉션

sp_invoke_external_rest_endpoint 는 호출된 엔드포인트에서 응답으로 수신된 HTTP 리디렉션을 자동으로 따르지 않습니다.

HTTP 헤더

sp_invoke_external_rest_endpoint 는 HTTP 요청에 다음 헤더를 자동으로 삽입합니다.

  • content-type: 다음으로 설정 application/json; charset=utf-8
  • accept: set to application/json
  • user-agent: 예를 들면 다음과 <EDITION>/<PRODUCT VERSION> 같습니다. SQL Azure/12.0.2000.8

사용자 에이전트는 항상 저장 프로시저에서 덮어쓰지만 콘텐츠 형식수락 헤더 값은 @headers 매개 변수를 통해 사용자가 정의할 수 있습니다. 콘텐츠 형식에서 미디어 형식 지시문만 지정할 수 있으며 문자 집합 또는 경계 지시문을 지정할 수 없습니다.

요청 및 응답 페이로드 지원 미디어 유형

헤더 콘텐츠 형식허용되는 값은 다음과 같습니다.

  • application/json
  • application/vnd.microsoft.*.json
  • application/xml
  • application/vnd.microsoft.*.xml
  • application/vnd.microsoft.*+xml
  • application/x-www-form-urlencoded
  • 문자 메시지/*

accept 헤더의 경우 허용되는 값은 다음과 같습니다.

  • application/json
  • application/xml
  • 문자 메시지/*

텍스트 헤더 형식에 대한 자세한 내용은 IANA텍스트 형식 레지스트리를 참조하세요.

참고 항목

cURL 또는 Insomnia와 같은 최신 REST 클라이언트와 같은 다른 도구를 사용하여 REST 엔드포인트 호출을 테스트하는 경우 동일한 동작 및 결과를 갖도록 자동으로 삽입되는 sp_invoke_external_rest_endpoint 동일한 헤더를 포함해야 합니다.

모범 사례

일괄 처리 기술 사용

예를 들어 AZURE Function 또는 이벤트 허브와 같이 REST 엔드포인트에 행 집합을 보내야 하는 경우 전송된 각 행에 대한 HTTPS 호출 오버헤드를 방지하기 위해 행을 단일 JSON 문서로 일괄 처리하는 것이 좋습니다. 이 작업은 문을 사용하여 FOR JSON 수행할 수 있습니다. 예를 들면 다음과 같습니다.

-- create the payload
DECLARE @payload AS NVARCHAR(MAX);

SET @payload = (
        SELECT [object_id], [name], [column_id]
        FROM sys.columns
        FOR JSON AUTO
        );

-- invoke the REST endpoint
DECLARE @retcode 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;

예제

여기서는 Azure Functions 또는 Azure Event Hubs와 같은 일반적인 Azure 서비스와 통합하는 데 사용하는 sp_invoke_external_rest_endpoint 방법에 대한 몇 가지 예제를 찾을 수 있습니다. 다른 서비스와 통합하기 위한 추가 샘플은 GitHub에서 찾을 수 있습니다.

A. 인증 없이 HTTP 트리거 바인딩을 사용하여 Azure Function 호출

다음 예제에서는 익명 액세스를 허용하는 HTTP 트리거 바인딩을 사용하여 Azure Function을 호출합니다.

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. 권한 부여 키와 함께 HTTP 트리거 바인딩을 사용하여 Azure Function 호출

다음 예제에서는 권한 부여 키를 요구하도록 구성된 HTTP 트리거 바인딩을 사용하여 Azure Function을 호출합니다. 권한 부여 키는 Azure Functions에서 x-function-key 요구하는 대로 헤더에 전달됩니다. 자세한 내용은 Azure Functions - 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. SAS 토큰을 사용하여 Azure Blob Storage에서 파일의 내용을 읽습니다.

이 예제에서는 인증을 위해 SAS 토큰을 사용하여 Azure Blob Storage에서 파일을 읽습니다. 결과가 XML로 반환되므로 헤더 "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. Azure SQL Database 관리 ID를 사용하여 이벤트 허브에 메시지 보내기

이 샘플에서는 Azure SQL 관리 ID를 사용하여 Event Hubs에 메시지를 보내는 방법을 보여 줍니다. 데이터베이스를 호스팅하는 Azure SQL Database 논리 서버에 대한 시스템 관리 ID 를 구성했는지 확인합니다. 예를 들면 다음과 같습니다.

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

그런 다음, Azure SQL Server의 관리 ID가 원하는 이벤트 허브에 메시지("Azure Event Hubs 데이터 보낸 사람" 역할)를 보낼 수 있도록 Event Hubs를 구성합니다. 자세한 내용은 관리 ID와 함께 Event Hubs 사용을 참조 하세요.

이 작업이 완료되면 사용할 데이터베이스 범위 자격 증명을 정의할 때 ID 이름을 사용할 Managed Identity 수 있습니다 sp_invoke_external_rest_endpoint. Event Hubs 리소스에 액세스하기 위해 Microsoft Entra ID를 사용하여 애플리케이션 인증에 설명된 대로 Microsoft Entra 인증을 사용할 때 사용할 리소스 이름(또는 ID)은 다음과 같습니다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. Azure SQL Database 범위 자격 증명을 사용하여 Azure File Storage에 파일 읽기 및 쓰기

다음은 인증을 위해 Azure SQL Database 범위 자격 증명을 사용하여 Azure File Storage에 파일을 쓴 다음 내용을 반환하는 예제입니다. 결과가 XML로 반환되므로 헤더 "Accept":"application/xml" 를 사용해야 합니다.

먼저 Azure SQL Database에 대한 마스터 키를 만듭니다.

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

그런 다음 Azure Blob Storage 계정에서 제공하는 SAS 토큰을 사용하여 데이터베이스 범위 자격 증명을 만듭니다.

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

다음으로 파일을 만들고 다음 두 문을 사용하여 텍스트를 추가합니다.

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

마지막으로 다음 문을 사용하여 파일을 읽습니다.

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