次の方法で共有


Azure Functions の Azure SQL 入力バインド

関数が実行されると、Azure SQL 入力バインドによりデータベースからデータが取得され、関数の入力パラメーターに渡されます。

セットアップと構成の詳細については、概要に関するページをご覧ください。

重要

この記事では、タブを使用して、Node.js プログラミング モデルの複数のバージョンに対応しています。 v4 モデルは一般提供されており、JavaScript と TypeScript の開発者にとって、より柔軟で直感的なエクスペリエンスが得られるように設計されています。 v4 モデルの動作の詳細については、Azure Functions Node.js 開発者ガイドを参照してください。 v3 と v4 の違いの詳細については、移行ガイドを参照してください。

A C# 関数は、次の C# モードのいずれかを使用して作成できます。

  • 分離されたワーカー モデル: ランタイムから分離されたワーカー プロセスで実行されるコンパイル済みの C# 関数。 分離ワーカー プロセスは、LTS および 非 LTS バージョンの .NET および .NET Framework で実行されている C# 関数をサポートするために必要です。
  • インプロセス モデル: Functions ランタイムと同じプロセスで実行されるコンパイル済みの C# 関数。
  • C# スクリプト: Azure portal で C# 関数を作成するときに主に使用されます。

Azure SQL 入力バインドのその他のサンプルは、GitHub リポジトリで入手できます。

このセクションには、次の例が含まれています。

次の例では ToDoItem クラスとそれに対応するデータベース テーブルを参照します。

namespace AzureSQL.ToDo
{
    public class ToDoItem
    {
        public Guid Id { get; set; }
        public int? order { get; set; }
        public string title { get; set; }
        public string url { get; set; }
        public bool? completed { get; set; }
    }
}
CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

HTTP トリガー、クエリ文字列からの ID による行の取得

次の例は、単一のレコードを取得する C# 関数を示しています。 この関数は、クエリ文字列を使用して ID を指定する HTTP 要求によってトリガーされます。 その ID は、指定されたクエリを使用して ToDoItem レコードを取得するために使用されます。

Note

HTTP クエリ文字列パラメーターは大文字と小文字が区別されます。

using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Sql;
using Microsoft.Azure.Functions.Worker.Http;

namespace AzureSQLSamples
{
    public static class GetToDoItem
    {
        [FunctionName("GetToDoItem")]
        public static IActionResult Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "gettodoitem")]
            HttpRequest req,
            [SqlInput(commandText: "select [Id], [order], [title], [url], [completed] from dbo.ToDo where Id = @Id",
                commandType: System.Data.CommandType.Text,
                parameters: "@Id={Query.id}",
                connectionStringSetting: "SqlConnectionString")]
            IEnumerable<ToDoItem> toDoItem)
        {
            return new OkObjectResult(toDoItem.FirstOrDefault());
        }
    }
}

HTTP トリガー、ルート パラメーターからの複数の行の取得

次の例は、クエリによって返されるドキュメントを取得する C# 関数を示しています。 この関数は、ルート データを使用してクエリ パラメーターの値を指定する HTTP 要求によってトリガーされます。 このパラメーターは、指定されたクエリ内の ToDoItem レコードをフィルター処理するために使用されます。

using System.Collections.Generic;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Sql;
using Microsoft.Azure.Functions.Worker.Http;

namespace AzureSQLSamples
{
    public static class GetToDoItems
    {
        [FunctionName("GetToDoItems")]
        public static IActionResult Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "gettodoitems/{priority}")]
            HttpRequest req,
            [SqlInput(commandText: "select [Id], [order], [title], [url], [completed] from dbo.ToDo where [Priority] > @Priority",
                commandType: System.Data.CommandType.Text,
                parameters: "@Priority={priority}",
                connectionStringSetting: "SqlConnectionString")]
            IEnumerable<ToDoItem> toDoItems)
        {
            return new OkObjectResult(toDoItems);
        }
    }
}

HTTP トリガー、行の削除

次の例は、HTTP 要求クエリ パラメーターからの入力を使用してストアド プロシージャを実行する C# 関数を示しています。

ストアド プロシージャ dbo.DeleteToDo は、SQL データベースに作成する必要があります。 この例では、ストアド プロシージャは、パラメーターの値に応じて 1 つのレコードまたはすべてのレコードを削除します。

CREATE PROCEDURE [dbo].[DeleteToDo]
    @Id NVARCHAR(100)
AS
    DECLARE @UID UNIQUEIDENTIFIER = TRY_CAST(@ID AS UNIQUEIDENTIFIER)
    IF @UId IS NOT NULL AND @Id != ''
    BEGIN
        DELETE FROM dbo.ToDo WHERE Id = @UID
    END
    ELSE
    BEGIN
        DELETE FROM dbo.ToDo WHERE @ID = ''
    END

    SELECT [Id], [order], [title], [url], [completed] FROM dbo.ToDo
GO
namespace AzureSQL.ToDo
{
    public static class DeleteToDo
    {
        // delete all items or a specific item from querystring
        // returns remaining items
        // uses input binding with a stored procedure DeleteToDo to delete items and return remaining items
        [FunctionName("DeleteToDo")]
        public static IActionResult Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "delete", Route = "DeleteFunction")] HttpRequest req,
            ILogger log,
            [SqlInput(commandText: "DeleteToDo", commandType: System.Data.CommandType.StoredProcedure, 
                parameters: "@Id={Query.id}", connectionStringSetting: "SqlConnectionString")] 
                IEnumerable<ToDoItem> toDoItems)
        {
            return new OkObjectResult(toDoItems);
        }
    }
}

Azure SQL 入力バインドのその他のサンプルは、GitHub リポジトリで入手できます。

このセクションには、次の例が含まれています。

次の例では ToDoItem クラス (別個のファイル ToDoItem.java 内) とそれに対応するデータベース テーブルを参照します。

package com.function;
import java.util.UUID;

public class ToDoItem {
    public UUID Id;
    public int order;
    public String title;
    public String url;
    public boolean completed;

    public ToDoItem() {
    }

    public ToDoItem(UUID Id, int order, String title, String url, boolean completed) {
        this.Id = Id;
        this.order = order;
        this.title = title;
        this.url = url;
        this.completed = completed;
    }
}
CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

HTTP トリガー、複数の行の取得

次の例は、HTTP 要求によってトリガーされ、クエリから読み取られ、HTTP 応答で結果を返す Java 関数の SQL 入力バインドを示しています。

package com.function;

import com.microsoft.azure.functions.HttpMethod;
import com.microsoft.azure.functions.HttpRequestMessage;
import com.microsoft.azure.functions.HttpResponseMessage;
import com.microsoft.azure.functions.HttpStatus;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;
import com.microsoft.azure.functions.sql.annotation.SQLInput;

import java.util.Optional;

public class GetToDoItems {
    @FunctionName("GetToDoItems")
    public HttpResponseMessage run(
            @HttpTrigger(
                name = "req",
                methods = {HttpMethod.GET},
                authLevel = AuthorizationLevel.ANONYMOUS)
                HttpRequestMessage<Optional<String>> request,
            @SQLInput(
                name = "toDoItems",
                commandText = "SELECT * FROM dbo.ToDo",
                commandType = "Text",
                connectionStringSetting = "SqlConnectionString")
                ToDoItem[] toDoItems) {
        return request.createResponseBuilder(HttpStatus.OK).header("Content-Type", "application/json").body(toDoItems).build();
    }
}

HTTP トリガー、クエリ文字列からの ID による行の取得

次の例は、HTTP 要求によってトリガーされ、クエリ文字列からパラメーターによってフィルター処理されたクエリから読み取られ、HTTP 応答の行を返す Java 関数の SQL 入力バインドを示しています。

public class GetToDoItem {
    @FunctionName("GetToDoItem")
    public HttpResponseMessage run(
            @HttpTrigger(
                name = "req",
                methods = {HttpMethod.GET},
                authLevel = AuthorizationLevel.ANONYMOUS)
                HttpRequestMessage<Optional<String>> request,
            @SQLInput(
                name = "toDoItems",
                commandText = "SELECT * FROM dbo.ToDo",
                commandType = "Text",
                parameters = "@Id={Query.id}",
                connectionStringSetting = "SqlConnectionString")
                ToDoItem[] toDoItems) {
        ToDoItem toDoItem = toDoItems[0];
        return request.createResponseBuilder(HttpStatus.OK).header("Content-Type", "application/json").body(toDoItem).build();
    }
}

HTTP トリガー、行の削除

次の例は、HTTP 要求によってトリガーされ、HTTP 要求クエリ パラメーターからの入力を使用してストアド プロシージャを実行する Java 関数の SQL 入力バインドを示しています。

ストアド プロシージャ dbo.DeleteToDo は、データベースに作成する必要があります。 この例では、ストアド プロシージャは、パラメーターの値に応じて 1 つのレコードまたはすべてのレコードを削除します。

CREATE PROCEDURE [dbo].[DeleteToDo]
    @Id NVARCHAR(100)
AS
    DECLARE @UID UNIQUEIDENTIFIER = TRY_CAST(@ID AS UNIQUEIDENTIFIER)
    IF @UId IS NOT NULL AND @Id != ''
    BEGIN
        DELETE FROM dbo.ToDo WHERE Id = @UID
    END
    ELSE
    BEGIN
        DELETE FROM dbo.ToDo WHERE @ID = ''
    END

    SELECT [Id], [order], [title], [url], [completed] FROM dbo.ToDo
GO
public class DeleteToDo {
    @FunctionName("DeleteToDo")
    public HttpResponseMessage run(
            @HttpTrigger(
                name = "req",
                methods = {HttpMethod.GET},
                authLevel = AuthorizationLevel.ANONYMOUS)
                HttpRequestMessage<Optional<String>> request,
            @SQLInput(
                name = "toDoItems",
                commandText = "dbo.DeleteToDo",
                commandType = "StoredProcedure",
                parameters = "@Id={Query.id}",
                connectionStringSetting = "SqlConnectionString")
                ToDoItem[] toDoItems) {
        return request.createResponseBuilder(HttpStatus.OK).header("Content-Type", "application/json").body(toDoItems).build();
    }
}

Azure SQL 入力バインドのその他のサンプルは、GitHub リポジトリで入手できます。

このセクションには、次の例が含まれています。

この例では、次のデータベース テーブルを参照します。

CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

HTTP トリガー、複数の行の取得

次の例は、HTTP 要求によってトリガーされ、クエリから読み取られ、HTTP 応答で結果を返す SQL 入力バインドを示しています。

import { app, HttpRequest, HttpResponseInit, input, InvocationContext } from '@azure/functions';

const sqlInput = input.sql({
    commandText: 'select [Id], [order], [title], [url], [completed] from dbo.ToDo',
    commandType: 'Text',
    connectionStringSetting: 'SqlConnectionString',
});

export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    context.log('HTTP trigger and SQL input binding function processed a request.');
    const toDoItems = context.extraInputs.get(sqlInput);
    return {
        jsonBody: toDoItems,
    };
}

app.http('httpTrigger1', {
    methods: ['GET'],
    authLevel: 'anonymous',
    extraInputs: [sqlInput],
    handler: httpTrigger1,
});
const { app, input } = require('@azure/functions');

const sqlInput = input.sql({
    commandText: 'select [Id], [order], [title], [url], [completed] from dbo.ToDo',
    commandType: 'Text',
    connectionStringSetting: 'SqlConnectionString',
});

app.http('httpTrigger1', {
    methods: ['GET'],
    authLevel: 'anonymous',
    extraInputs: [sqlInput],
    handler: (request, context) => {
        context.log('HTTP trigger and SQL input binding function processed a request.');
        const toDoItems = context.extraInputs.get(sqlInput);
        return {
            jsonBody: toDoItems,
        };
    },
});

HTTP トリガー、クエリ文字列からの ID による行の取得

次の例は、HTTP 要求によってトリガーされ、クエリ文字列からパラメーターによってフィルター処理されたクエリから読み取られ、HTTP 応答の行を返す SQL 入力バインドを示しています。

import { app, HttpRequest, HttpResponseInit, input, InvocationContext } from '@azure/functions';

const sqlInput = input.sql({
    commandText: 'select [Id], [order], [title], [url], [completed] from dbo.ToDo where Id = @Id',
    commandType: 'Text',
    parameters: '@Id={Query.id}',
    connectionStringSetting: 'SqlConnectionString',
});

export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    context.log('HTTP trigger and SQL input binding function processed a request.');
    const toDoItem = context.extraInputs.get(sqlInput);
    return {
        jsonBody: toDoItem,
    };
}

app.http('httpTrigger1', {
    methods: ['GET'],
    authLevel: 'anonymous',
    extraInputs: [sqlInput],
    handler: httpTrigger1,
});
const { app, input } = require('@azure/functions');

const sqlInput = input.sql({
    commandText: 'select [Id], [order], [title], [url], [completed] from dbo.ToDo where Id = @Id',
    commandType: 'Text',
    parameters: '@Id={Query.id}',
    connectionStringSetting: 'SqlConnectionString',
});

app.http('httpTrigger1', {
    methods: ['GET'],
    authLevel: 'anonymous',
    extraInputs: [sqlInput],
    handler: (request, context) => {
        context.log('HTTP trigger and SQL input binding function processed a request.');
        const toDoItem = context.extraInputs.get(sqlInput);
        return {
            jsonBody: toDoItem,
        };
    },
});

HTTP トリガー、行の削除

次の例は、HTTP 要求によってトリガーされ、HTTP 要求クエリ パラメーターからの入力を使用してストアド プロシージャを実行する SQL 入力バインドを示しています。

ストアド プロシージャ dbo.DeleteToDo は、データベースに作成する必要があります。 この例では、ストアド プロシージャは、パラメーターの値に応じて 1 つのレコードまたはすべてのレコードを削除します。

CREATE PROCEDURE [dbo].[DeleteToDo]
    @Id NVARCHAR(100)
AS
    DECLARE @UID UNIQUEIDENTIFIER = TRY_CAST(@ID AS UNIQUEIDENTIFIER)
    IF @UId IS NOT NULL AND @Id != ''
    BEGIN
        DELETE FROM dbo.ToDo WHERE Id = @UID
    END
    ELSE
    BEGIN
        DELETE FROM dbo.ToDo WHERE @ID = ''
    END

    SELECT [Id], [order], [title], [url], [completed] FROM dbo.ToDo
GO
import { app, HttpRequest, HttpResponseInit, input, InvocationContext } from '@azure/functions';

const sqlInput = input.sql({
    commandText: 'DeleteToDo',
    commandType: 'StoredProcedure',
    parameters: '@Id={Query.id}',
    connectionStringSetting: 'SqlConnectionString',
});

export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    context.log('HTTP trigger and SQL input binding function processed a request.');
    const toDoItems = context.extraInputs.get(sqlInput);
    return {
        jsonBody: toDoItems,
    };
}

app.http('httpTrigger1', {
    methods: ['GET'],
    authLevel: 'anonymous',
    extraInputs: [sqlInput],
    handler: httpTrigger1,
});
const { app, input } = require('@azure/functions');

const sqlInput = input.sql({
    commandText: 'DeleteToDo',
    commandType: 'StoredProcedure',
    parameters: '@Id={Query.id}',
    connectionStringSetting: 'SqlConnectionString',
});

app.http('httpTrigger1', {
    methods: ['GET'],
    authLevel: 'anonymous',
    extraInputs: [sqlInput],
    handler: (request, context) => {
        context.log('HTTP trigger and SQL input binding function processed a request.');
        const toDoItems = context.extraInputs.get(sqlInput);
        return {
            jsonBody: toDoItems,
        };
    },
});

Azure SQL 入力バインドのその他のサンプルは、GitHub リポジトリで入手できます。

このセクションには、次の例が含まれています。

この例では、次のデータベース テーブルを参照します。

CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

HTTP トリガー、複数の行の取得

次の例は、function.json ファイル内の SQL 入力バインドと、HTTP 要求によってトリガーされ、クエリから読み取られ、HTTP 応答で結果を返す PowerShell 関数を示しています。

function.json ファイルのバインド データを次に示します。

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "get"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "res"
},
{
    "name": "todoItems",
    "type": "sql",
    "direction": "in",
    "commandText": "select [Id], [order], [title], [url], [completed] from dbo.ToDo",
    "commandType": "Text",
    "connectionStringSetting": "SqlConnectionString"
}

これらのプロパティについては、「構成」セクションを参照してください。

run.ps1 ファイル内の関数の PowerShell コードの例を次に示します。

using namespace System.Net

param($Request, $todoItems)

Write-Host "PowerShell function with SQL Input Binding processed a request."

Push-OutputBinding -Name res -Value ([HttpResponseContext]@{
    StatusCode = [System.Net.HttpStatusCode]::OK
    Body = $todoItems
})

HTTP トリガー、クエリ文字列からの ID による行の取得

次の例は、HTTP 要求によってトリガーされ、クエリ文字列からパラメーターによってフィルター処理されたクエリから読み取られ、HTTP 応答の行を返す PowerShell 関数の SQL 入力バインドを示しています。

function.json ファイルのバインド データを次に示します。

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "get"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "res"
},
{
    "name": "todoItem",
    "type": "sql",
    "direction": "in",
    "commandText": "select [Id], [order], [title], [url], [completed] from dbo.ToDo where Id = @Id",
    "commandType": "Text",
    "parameters": "@Id = {Query.id}",
    "connectionStringSetting": "SqlConnectionString"
}

これらのプロパティについては、「構成」セクションを参照してください。

run.ps1 ファイル内の関数の PowerShell コードの例を次に示します。

using namespace System.Net

param($Request, $todoItem)

Write-Host "PowerShell function with SQL Input Binding processed a request."

Push-OutputBinding -Name res -Value ([HttpResponseContext]@{
    StatusCode = [System.Net.HttpStatusCode]::OK
    Body = $todoItem
})

HTTP トリガー、行の削除

次の例は、FUNCTION.JSON ファイル内の SQL 入力バインドと、HTTP 要求によってトリガーされ、HTTP 要求クエリ パラメーターからの入力を使用してストアド プロシージャを実行する PowerShell 関数を示しています。

ストアド プロシージャ dbo.DeleteToDo は、データベースに作成する必要があります。 この例では、ストアド プロシージャは、パラメーターの値に応じて 1 つのレコードまたはすべてのレコードを削除します。

CREATE PROCEDURE [dbo].[DeleteToDo]
    @Id NVARCHAR(100)
AS
    DECLARE @UID UNIQUEIDENTIFIER = TRY_CAST(@ID AS UNIQUEIDENTIFIER)
    IF @UId IS NOT NULL AND @Id != ''
    BEGIN
        DELETE FROM dbo.ToDo WHERE Id = @UID
    END
    ELSE
    BEGIN
        DELETE FROM dbo.ToDo WHERE @ID = ''
    END

    SELECT [Id], [order], [title], [url], [completed] FROM dbo.ToDo
GO
{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "get"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "res"
},
{
    "name": "todoItems",
    "type": "sql",
    "direction": "in",
    "commandText": "DeleteToDo",
    "commandType": "StoredProcedure",
    "parameters": "@Id = {Query.id}",
    "connectionStringSetting": "SqlConnectionString"
}

これらのプロパティについては、「構成」セクションを参照してください。

run.ps1 ファイル内の関数の PowerShell コードの例を次に示します。

using namespace System.Net

param($Request, $todoItems)

Write-Host "PowerShell function with SQL Input Binding processed a request."

Push-OutputBinding -Name res -Value ([HttpResponseContext]@{
    StatusCode = [System.Net.HttpStatusCode]::OK
    Body = $todoItems
})

Azure SQL 入力バインドのその他のサンプルは、GitHub リポジトリで入手できます。

このセクションには、次の例が含まれています。

この例では、次のデータベース テーブルを参照します。

CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

HTTP トリガー、複数の行の取得

次の例は、function.json ファイル内の SQL 入力バインドと、HTTP 要求によってトリガーされ、クエリから読み取られ、HTTP 応答で結果を返す Python 関数を示しています。

function_app.py ファイルの Python コードの例を次に示します。

import json
import logging
import azure.functions as func
from azure.functions.decorators.core import DataType

app = func.FunctionApp()

@app.function_name(name="GetToDo")
@app.route(route="gettodo")
@app.sql_input(arg_name="todo",
                        command_text="select [Id], [order], [title], [url], [completed] from dbo.ToDo",
                        command_type="Text",
                        connection_string_setting="SqlConnectionString")
def get_todo(req: func.HttpRequest, todo: func.SqlRowList) -> func.HttpResponse:
    rows = list(map(lambda r: json.loads(r.to_json()), todo))

    return func.HttpResponse(
        json.dumps(rows),
        status_code=200,
        mimetype="application/json"
    )

HTTP トリガー、クエリ文字列からの ID による行の取得

次の例は、HTTP 要求によってトリガーされ、クエリ文字列からパラメーターによってフィルター処理されたクエリから読み取られ、HTTP 応答の行を返す Python 関数の SQL 入力バインドを示しています。

function_app.py ファイルの Python コードの例を次に示します。

import json
import logging
import azure.functions as func
from azure.functions.decorators.core import DataType

app = func.FunctionApp()

@app.function_name(name="GetToDo")
@app.route(route="gettodo/{id}")
@app.sql_input(arg_name="todo",
                        command_text="select [Id], [order], [title], [url], [completed] from dbo.ToDo where Id = @Id",
                        command_type="Text",
                        parameters="@Id={id}",
                        connection_string_setting="SqlConnectionString")
def get_todo(req: func.HttpRequest, todo: func.SqlRowList) -> func.HttpResponse:
    rows = list(map(lambda r: json.loads(r.to_json()), todo))

    return func.HttpResponse(
        json.dumps(rows),
        status_code=200,
        mimetype="application/json"
    )

HTTP トリガー、行の削除

次の例は、FUNCTION.JSON ファイル内の SQL 入力バインドと、HTTP 要求によってトリガーされ、HTTP 要求クエリ パラメーターからの入力を使用してストアド プロシージャを実行する Python 関数を示しています。

ストアド プロシージャ dbo.DeleteToDo は、データベースに作成する必要があります。 この例では、ストアド プロシージャは、パラメーターの値に応じて 1 つのレコードまたはすべてのレコードを削除します。

CREATE PROCEDURE [dbo].[DeleteToDo]
    @Id NVARCHAR(100)
AS
    DECLARE @UID UNIQUEIDENTIFIER = TRY_CAST(@ID AS UNIQUEIDENTIFIER)
    IF @UId IS NOT NULL AND @Id != ''
    BEGIN
        DELETE FROM dbo.ToDo WHERE Id = @UID
    END
    ELSE
    BEGIN
        DELETE FROM dbo.ToDo WHERE @ID = ''
    END

    SELECT [Id], [order], [title], [url], [completed] FROM dbo.ToDo
GO

function_app.py ファイルの Python コードの例を次に示します。

import json
import logging
import azure.functions as func
from azure.functions.decorators.core import DataType

app = func.FunctionApp()

@app.function_name(name="DeleteToDo")
@app.route(route="deletetodo/{id}")
@app.sql_input(arg_name="todo",
                        command_text="DeleteToDo",
                        command_type="StoredProcedure",
                        parameters="@Id={id}",
                        connection_string_setting="SqlConnectionString")
def get_todo(req: func.HttpRequest, todo: func.SqlRowList) -> func.HttpResponse:
    rows = list(map(lambda r: json.loads(r.to_json()), todo))

    return func.HttpResponse(
        json.dumps(rows),
        status_code=200,
        mimetype="application/json"
    )

属性

C# ライブラリでは SqlAttribute 属性を使用して、次のプロパティを持つ関数で SQL バインディングを宣言します。

属性のプロパティ 説明
CommandText 必須。 バインドによって実行される Transact-SQL クエリ コマンドまたはストアド プロシージャの名前。
ConnectionStringSetting 必須。 クエリまたはストアド プロシージャの実行対象となるデータベースの接続文字列を含むアプリ設定の名前。 この値は実際の接続文字列ではなく、代わりに環境変数名に解決される必要があります。
CommandType 必須。 CommandType 値。これは、クエリの場合はテキストで、ストアド プロシージャの場合は StoredProcedure です。
パラメーター 省略可能。 実行時に 1 つの文字列としてコマンドに渡される 0 個以上のパラメーター値。 @param1=param1,@param2=param2 という形式に従う必要があります。 パラメーター名とパラメーター値のどちらにも、コンマ (,) または等号 (=) を含めることはできません。

注釈

Java 関数ランタイム ライブラリで、その値が Azure SQL に由来するパラメーター上で @SQLInput 注釈 (com.microsoft.azure.functions.sql.annotation.SQLInput) を使用します。 この注釈は、次の要素をサポートします。

要素 説明
commandText 必須。 バインドによって実行される Transact-SQL クエリ コマンドまたはストアド プロシージャの名前。
connectionStringSetting 必須。 クエリまたはストアド プロシージャの実行対象となるデータベースの接続文字列を含むアプリ設定の名前。 この値は実際の接続文字列ではなく、代わりに環境変数名に解決される必要があります。
commandType 必須。 CommandType 値。これは、クエリの場合は "Text" で、ストアド プロシージャの場合は "StoredProcedure" です。
name 必須。 関数バインドの一意の名前。
parameters 省略可能。 実行時に 1 つの文字列としてコマンドに渡される 0 個以上のパラメーター値。 @param1=param1,@param2=param2 という形式に従う必要があります。 パラメーター名とパラメーター値のどちらにも、コンマ (,) または等号 (=) を含めることはできません。

構成

次の表では、input.sql() メソッドに渡される options オブジェクトに対して設定できるプロパティについて説明します。

プロパティ 説明
commandText 必須。 バインドによって実行される Transact-SQL クエリ コマンドまたはストアド プロシージャの名前。
connectionStringSetting 必須。 クエリまたはストアド プロシージャの実行対象となるデータベースの接続文字列を含むアプリ設定の名前。 この値は実際の接続文字列ではなく、代わりに環境変数名に解決される必要があります。 接続文字列値の省略可能なキーワードは、SQL バインドの接続を調整するために使用できます
commandType 必須。 CommandType 値。これは、クエリの場合はテキストで、ストアド プロシージャの場合は StoredProcedure です。
parameters 省略可能。 実行時に 1 つの文字列としてコマンドに渡される 0 個以上のパラメーター値。 @param1=param1,@param2=param2 という形式に従う必要があります。 パラメーター名とパラメーター値のどちらにも、コンマ (,) または等号 (=) を含めることはできません。

構成

次の表は、function.json ファイルで設定したバインド構成のプロパティを説明しています。

function.json のプロパティ 説明
type 必須。 sql に設定する必要があります。
direction 必須。 in に設定する必要があります。
name 必須。 関数コード内のクエリ結果を表す変数の名前。
commandText 必須。 バインドによって実行される Transact-SQL クエリ コマンドまたはストアド プロシージャの名前。
connectionStringSetting 必須。 クエリまたはストアド プロシージャの実行対象となるデータベースの接続文字列を含むアプリ設定の名前。 この値は実際の接続文字列ではなく、代わりに環境変数名に解決される必要があります。 接続文字列値の省略可能なキーワードは、SQL バインドの接続を調整するために使用できます
commandType 必須。 CommandType 値。これは、クエリの場合はテキストで、ストアド プロシージャの場合は StoredProcedure です。
parameters 省略可能。 実行時に 1 つの文字列としてコマンドに渡される 0 個以上のパラメーター値。 @param1=param1,@param2=param2 という形式に従う必要があります。 パラメーター名とパラメーター値のどちらにも、コンマ (,) または等号 (=) を含めることはできません。

ローカルで開発する場合は、Values コレクション内の local.settings.json ファイルにアプリケーション設定を追加します。

使用方法

この属性のコンストラクターは、SQL コマンド テキスト、コマンドの種類、パラメーター、接続文字列設定名を受け取ります。 コマンドは、コマンドの種類 System.Data.CommandType.Text を指定した Transact-SQL (T-SQL) クエリ、またはコマンドの種類 System.Data.CommandType.StoredProcedure を指定したストアド プロシージャ名にすることができます。 接続文字列設定名は、Azure SQL または SQL Server インスタンスへの接続の接続文字列が含まれるアプリケーション設定 (ローカル開発の場合は local.settings.json の) に合致します。

入力バインドによって実行されるクエリは、Microsoft.Data.SqlClient でパラメーター化され、バインドに渡されるパラメーター値からの SQL インジェクションのリスクを軽減します。

SQL 入力バインドの実行時に例外が発生した場合、関数コードは実行されません。 これにより、HTTP トリガーが 500 エラー コードを返すなど、エラー コードが返される可能性があります。

次のステップ