Condividi tramite


Associazione di input SQL di Azure per Funzioni di Azure

Quando viene eseguita una funzione, l'associazione di input SQL di Azure recupera i dati da un database e lo passa al parametro di input della funzione.

Per informazioni sui dettagli di impostazione e configurazione, vedere la panoramica.

Importante

Questo articolo usa schede per supportare più versioni del modello di programmazione Node.js. Il modello v4 è disponibile a livello generale ed è progettato per offrire un'esperienza più flessibile e intuitiva per gli sviluppatori JavaScript e TypeScript. Per altre informazioni sul funzionamento del modello v4, vedere la guida per sviluppatori di Funzioni di Azure Node.js. Per altre informazioni sulle differenze tra v3 e v4, vedere la guida alla migrazione.

Esempi

È possibile creare una funzione C# usando una delle modalità C# seguenti:

  • Modello di lavoro isolato: funzione C# compilata eseguita in un processo di lavoro isolato dal runtime. Il processo di lavoro isolato è necessario per supportare le funzioni C# in esecuzione in LTS e versioni non LTS .NET e .NET Framework.
  • Modello in-process: funzione C# compilata eseguita nello stesso processo del runtime di Funzioni.
  • Script C#: usato principalmente quando si creano funzioni C# nel portale di Azure.

Altri esempi per l'associazione di input SQL di Azure sono disponibili nel repository GitHub.

Questa sezione contiene gli esempi seguenti:

Gli esempi fanno riferimento a una ToDoItem classe e a una tabella di database corrispondente:

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

Trigger HTTP, ottenere riga per ID dalla stringa di query

L'esempio seguente illustra una funzione C# che recupera un singolo record. La funzione viene attivata da una richiesta HTTP che usa una stringa di query per specificare l'ID. Tale ID viene usato per recuperare un ToDoItem record con la query specificata.

Nota

Il parametro di stringa di query HTTP fa distinzione tra maiuscole e minuscole.

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

Trigger HTTP, ottenere più righe dal parametro di route

L'esempio seguente illustra una funzione C# che recupera i documenti restituiti dalla query. La funzione viene attivata da una richiesta HTTP che usa i dati di route per specificare il valore di un parametro di query. Tale parametro viene usato per filtrare i ToDoItem record nella query specificata.

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

Trigger HTTP, eliminazione di righe

L'esempio seguente illustra una funzione C# che esegue una stored procedure con input dal parametro di query della richiesta HTTP.

La stored procedure dbo.DeleteToDo deve essere creata nel database SQL. In questo esempio, la stored procedure elimina un singolo record o tutti i record a seconda del valore del parametro .

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

Altri esempi per l'associazione di input SQL di Azure sono disponibili nel repository GitHub.

Questa sezione contiene gli esempi seguenti:

Gli esempi fanno riferimento a una ToDoItem classe (in un file ToDoItem.javaseparato ) e a una tabella di database corrispondente:

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

Trigger HTTP, ottenere più righe

L'esempio seguente mostra un'associazione di input SQL in una funzione Java attivata da una richiesta HTTP e legge da una query e restituisce i risultati nella risposta HTTP.

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

Trigger HTTP, ottenere riga per ID dalla stringa di query

L'esempio seguente mostra un'associazione di input SQL in una funzione Java attivata da una richiesta HTTP e legge da una query filtrata da un parametro dalla stringa di query e restituisce la riga nella risposta HTTP.

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

Trigger HTTP, eliminazione di righe

L'esempio seguente illustra un'associazione di input SQL in una funzione Java attivata da una richiesta HTTP ed esegue una stored procedure con input dal parametro di query della richiesta HTTP.

La stored procedure dbo.DeleteToDo deve essere creata nel database. In questo esempio, la stored procedure elimina un singolo record o tutti i record a seconda del valore del parametro .

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

Altri esempi per l'associazione di input SQL di Azure sono disponibili nel repository GitHub.

Questa sezione contiene gli esempi seguenti:

Gli esempi fanno riferimento a una tabella di database:

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

Trigger HTTP, ottenere più righe

L'esempio seguente mostra un'associazione di input SQL attivata da una richiesta HTTP e legge da una query e restituisce i risultati nella risposta HTTP.

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,
        };
    },
});

Trigger HTTP, ottenere riga per ID dalla stringa di query

L'esempio seguente mostra un'associazione di input SQL attivata da una richiesta HTTP e legge da una query filtrata da un parametro dalla stringa di query e restituisce la riga nella risposta HTTP.

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,
        };
    },
});

Trigger HTTP, eliminazione di righe

L'esempio seguente illustra un'associazione di input SQL attivata da una richiesta HTTP ed esegue una stored procedure con input dal parametro di query della richiesta HTTP.

La stored procedure dbo.DeleteToDo deve essere creata nel database. In questo esempio, la stored procedure elimina un singolo record o tutti i record a seconda del valore del parametro .

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,
        };
    },
});

Altri esempi per l'associazione di input SQL di Azure sono disponibili nel repository GitHub.

Questa sezione contiene gli esempi seguenti:

Gli esempi fanno riferimento a una tabella di database:

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

Trigger HTTP, ottenere più righe

L'esempio seguente mostra un'associazione di input SQL in un file function.json e una funzione di PowerShell attivata da una richiesta HTTP e legge da una query e restituisce i risultati nella risposta HTTP.

Di seguito sono riportati i dati di associazione nel file 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"
}

Queste proprietà sono descritte nella sezione configuration.

Di seguito è riportato il codice di PowerShell di esempio per la funzione nel run.ps1 file :

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

Trigger HTTP, ottenere riga per ID dalla stringa di query

L'esempio seguente illustra un'associazione di input SQL in una funzione di PowerShell attivata da una richiesta HTTP e legge da una query filtrata in base a un parametro dalla stringa di query e restituisce la riga nella risposta HTTP.

Di seguito sono riportati i dati di associazione nel file 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"
}

Queste proprietà sono descritte nella sezione configuration.

Di seguito è riportato il codice di PowerShell di esempio per la funzione nel run.ps1 file :

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

Trigger HTTP, eliminazione di righe

L'esempio seguente illustra un'associazione di input SQL in un file function.json e una funzione di PowerShell attivata da una richiesta HTTP ed esegue una stored procedure con input dal parametro di query della richiesta HTTP.

La stored procedure dbo.DeleteToDo deve essere creata nel database. In questo esempio, la stored procedure elimina un singolo record o tutti i record a seconda del valore del parametro .

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

Queste proprietà sono descritte nella sezione configuration.

Di seguito è riportato il codice di PowerShell di esempio per la funzione nel run.ps1 file :

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

Altri esempi per l'associazione di input SQL di Azure sono disponibili nel repository GitHub.

Questa sezione contiene gli esempi seguenti:

Gli esempi fanno riferimento a una tabella di database:

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

Trigger HTTP, ottenere più righe

L'esempio seguente illustra un'associazione di input SQL in un file function.json e una funzione Python attivata da una richiesta HTTP e legge da una query e restituisce i risultati nella risposta HTTP.

Di seguito è riportato il codice Python di esempio per il file function_app.py:

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

Trigger HTTP, ottenere riga per ID dalla stringa di query

L'esempio seguente mostra un'associazione di input SQL in una funzione Python attivata da una richiesta HTTP e legge da una query filtrata da un parametro dalla stringa di query e restituisce la riga nella risposta HTTP.

Di seguito è riportato il codice Python di esempio per il file function_app.py:

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

Trigger HTTP, eliminazione di righe

L'esempio seguente mostra un'associazione di input SQL in un file function.json e una funzione Python attivata da una richiesta HTTP ed esegue una stored procedure con input dal parametro di query della richiesta HTTP.

La stored procedure dbo.DeleteToDo deve essere creata nel database. In questo esempio, la stored procedure elimina un singolo record o tutti i record a seconda del valore del parametro .

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

Di seguito è riportato il codice Python di esempio per il file function_app.py:

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

Attributi

La libreria C# usa l'attributo SqlAttribute per dichiarare le associazioni SQL nella funzione, con le proprietà seguenti:

Proprietà dell'attributo Descrizione
CommandText Obbligatorio. Comando di query Transact-SQL o nome della stored procedure eseguita dall'associazione.
ConnectionStringSetting Obbligatorio. Nome di un'impostazione dell'app contenente il stringa di connessione per il database in cui viene eseguita la query o la stored procedure. Questo valore non è il stringa di connessione effettivo e deve essere invece risolto in un nome di variabile di ambiente.
CommandType Obbligatorio. Valore CommandType , ovvero Text per una query e StoredProcedure per una stored procedure.
Parametri Facoltativo. Zero o più valori di parametro passati al comando durante l'esecuzione come singola stringa. Deve seguire il formato @param1=param1,@param2=param2. Né il nome del parametro né il valore del parametro possono contenere una virgola (,) o un segno di uguale (=).

Annotazioni

Nella libreria di runtime delle funzioni Java usare l'annotazione @SQLInput (com.microsoft.azure.functions.sql.annotation.SQLInput) nei parametri il cui valore proviene da Azure SQL. Questa annotazione supporta gli elementi seguenti:

Elemento Descrizione
commandText Obbligatorio. Comando di query Transact-SQL o nome della stored procedure eseguita dall'associazione.
connectionStringSetting Obbligatorio. Nome di un'impostazione dell'app contenente il stringa di connessione per il database in cui viene eseguita la query o la stored procedure. Questo valore non è il stringa di connessione effettivo e deve essere invece risolto in un nome di variabile di ambiente.
commandType Obbligatorio. Valore CommandType , ovvero "Text" per una query e "StoredProcedure" per una stored procedure.
name Obbligatorio. Nome univoco dell'associazione di funzioni.
parameters Facoltativo. Zero o più valori di parametro passati al comando durante l'esecuzione come singola stringa. Deve seguire il formato @param1=param1,@param2=param2. Né il nome del parametro né il valore del parametro possono contenere una virgola (,) o un segno di uguale (=).

Impostazione

Nella tabella seguente vengono illustrate le proprietà che è possibile impostare sull'oggetto options passato al input.sql() metodo .

Proprietà Descrizione
commandText Obbligatorio. Comando di query Transact-SQL o nome della stored procedure eseguita dall'associazione.
connectionStringSetting Obbligatorio. Nome di un'impostazione dell'app contenente il stringa di connessione per il database in cui viene eseguita la query o la stored procedure. Questo valore non è il stringa di connessione effettivo e deve essere invece risolto in un nome di variabile di ambiente. Le parole chiave facoltative nel valore stringa di connessione sono disponibili per perfezionare la connettività delle associazioni SQL.
commandType Obbligatorio. Valore CommandType , ovvero Text per una query e StoredProcedure per una stored procedure.
parameters Facoltativo. Zero o più valori di parametro passati al comando durante l'esecuzione come singola stringa. Deve seguire il formato @param1=param1,@param2=param2. Né il nome del parametro né il valore del parametro possono contenere una virgola (,) o un segno di uguale (=).

Impostazione

Nella tabella seguente sono illustrate le proprietà di configurazione dell'associazione impostate nel file function.json.

Proprietà di function.json Descrizione
type Obbligatorio. Deve essere impostato su sql.
direction Obbligatorio. Deve essere impostato su in.
name Obbligatorio. Nome della variabile che rappresenta i risultati della query nel codice della funzione.
commandText Obbligatorio. Comando di query Transact-SQL o nome della stored procedure eseguita dall'associazione.
connectionStringSetting Obbligatorio. Nome di un'impostazione dell'app contenente il stringa di connessione per il database in cui viene eseguita la query o la stored procedure. Questo valore non è il stringa di connessione effettivo e deve essere invece risolto in un nome di variabile di ambiente. Le parole chiave facoltative nel valore stringa di connessione sono disponibili per perfezionare la connettività delle associazioni SQL.
commandType Obbligatorio. Valore CommandType , ovvero Text per una query e StoredProcedure per una stored procedure.
parameters Facoltativo. Zero o più valori di parametro passati al comando durante l'esecuzione come singola stringa. Deve seguire il formato @param1=param1,@param2=param2. Né il nome del parametro né il valore del parametro possono contenere una virgola (,) o un segno di uguale (=).

Quando si sviluppa in locale, aggiungere le impostazioni dell'applicazione nel file local.settings.json nella Values raccolta.

Utilizzo

Il costruttore dell'attributo accetta il testo del comando SQL, il tipo di comando, i parametri e il nome dell'impostazione stringa di connessione. Il comando può essere una query Transact-SQL (T-SQL) con il tipo di System.Data.CommandType.Text comando o il nome della stored procedure con il tipo di System.Data.CommandType.StoredProcedurecomando . Il nome dell'impostazione stringa di connessione corrisponde all'impostazione dell'applicazione (in local.settings.json per lo sviluppo locale) che contiene il stringa di connessione all'istanza di SQL o SQL Server di Azure.

Le query eseguite dall'associazione di input vengono parametrizzate in Microsoft.Data.SqlClient per ridurre il rischio di inserimento SQL dai valori dei parametri passati nell'associazione.

Se si verifica un'eccezione quando viene eseguita un'associazione di input SQL, il codice della funzione non verrà eseguito. Ciò può comportare la restituzione di un codice di errore, ad esempio un trigger HTTP che restituisce un codice di errore 500.

Passaggi successivi