Enlace de entrada de Azure SQL para Azure Functions

Cuando se ejecuta una función, el enlace de entrada de Azure SQL recupera datos de una base de datos y los pasa al parámetro de entrada de la función.

Para obtener información sobre los detalles de instalación y configuración, consulte Introducción.

Importante

En este artículo se usan pestañas para admitir varias versiones del modelo de programación de Node.js. El modelo v4 está disponible de forma general y está diseñado para que los desarrolladores de JavaScript y TypeScript tengan una experiencia más flexible e intuitiva. Para más detalles acerca de cómo funciona el modelo v4, consulte la Guía para desarrolladores de Node.js de Azure Functions. Para obtener más información sobre las diferencias entre v3 y v4, consulte la Guía de migración.

Ejemplos

Se puede crear una función C# mediante uno de los siguientes modos de C#:

  • Modelo de trabajo aislado: función compilada en C# que se ejecuta en un proceso trabajador aislado del tiempo de ejecución. Se requiere un proceso de trabajo aislado para admitir funciones de C# ejecutándose en versiones de .NET que son y no son LTS y .NET Framework.
  • Modelo en curso: función C# compilada que se ejecuta en el mismo proceso que el tiempo de ejecución de Functions.
  • Script de C#: se usa principalmente al crear funciones de C# en Azure Portal.

Hay disponibles más ejemplos para el enlace de entrada de Azure SQL en el repositorio de GitHub.

En esta sección se incluyen los ejemplos siguientes:

En este ejemplo se hace referencia a una clase ToDoItem y una tabla de base de datos correspondiente:

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

Desencadenador HTTP, obtención de fila por id. de la cadena de consulta

En el ejemplo siguiente se muestra una función de C# que recupera un registro individual. La función se desencadena mediante una solicitud HTTP que usa una cadena de consulta para especificar el identificador. Ese identificador se usa para recuperar un registro ToDoItem con la consulta especificada.

Nota

El parámetro de la cadena de consulta HTTP distingue mayúsculas de minúsculas.

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

Desencadenador HTTP, obtención de varias filas del parámetro de ruta

En el ejemplo siguiente se muestra una función de C# que recupera documentos devueltos por la consulta. La función se desencadena mediante una solicitud HTTP que usa datos de ruta para especificar el valor de un parámetro de consulta. Ese parámetro se usa para filtrar los registros ToDoItem de la consulta especificada.

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

Desencadenador HTTP, eliminación de filas

En el ejemplo siguiente se muestra una función de C# que ejecuta un procedimiento almacenado con la entrada del parámetro de consulta de solicitud HTTP.

El procedimiento almacenado dbo.DeleteToDo debe crearse en la base de datos SQL. En este ejemplo, el procedimiento almacenado elimina un único registro o todos los registros en función del valor del parámetro.

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

Hay disponibles más ejemplos para el enlace de entrada de Azure SQL en el repositorio de GitHub.

En esta sección se incluyen los ejemplos siguientes:

En este ejemplo se hace referencia a una clase ToDoItem (en un archivo ToDoItem.java independiente) y una tabla de base de datos correspondiente:

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

Desencadenador HTTP, obtención de varias filas

En el ejemplo siguiente se muestra un enlace de entrada SQL en una función de Java desencadenada por una solicitud HTTP y lee desde una consulta y devuelve los resultados en la respuesta 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();
    }
}

Desencadenador HTTP, obtención de fila por id. de la cadena de consulta

En el ejemplo siguiente se muestra un enlace de entrada SQL en una función java desencadenada por una solicitud HTTP y lee desde una consulta filtrada por un parámetro de la cadena de consulta y devuelve la fila en la respuesta 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();
    }
}

Desencadenador HTTP, eliminación de filas

En el ejemplo siguiente se muestra un enlace de entrada SQL en una función java desencadenada por una solicitud HTTP y ejecuta un procedimiento almacenado con entrada del parámetro de consulta de solicitud HTTP.

El procedimiento almacenado dbo.DeleteToDo debe crearse en la base de datos. En este ejemplo, el procedimiento almacenado elimina un único registro o todos los registros en función del valor del parámetro.

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

Hay disponibles más ejemplos para el enlace de entrada de Azure SQL en el repositorio de GitHub.

En esta sección se incluyen los ejemplos siguientes:

Los ejemplos hacen referencia a una tabla de base de datos:

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

Desencadenador HTTP, obtención de varias filas

En el ejemplo siguiente se muestra un enlace de entrada SQL desencadenado por una solicitud HTTP y lee de una consulta y devuelve los resultados en la respuesta 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,
        };
    },
});

Desencadenador HTTP, obtención de fila por id. de la cadena de consulta

En el ejemplo siguiente se muestra un enlace de entrada SQL desencadenado por una solicitud HTTP y lee desde una consulta filtrada por un parámetro de la cadena de consulta y devuelve la fila en la respuesta 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,
        };
    },
});

Desencadenador HTTP, eliminación de filas

En el ejemplo siguiente se muestra un enlace de entrada SQL desencadenado por una solicitud HTTP y se ejecuta un procedimiento almacenado con entrada del parámetro de consulta de solicitud HTTP.

El procedimiento almacenado dbo.DeleteToDo debe crearse en la base de datos. En este ejemplo, el procedimiento almacenado elimina un único registro o todos los registros en función del valor del parámetro.

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

Hay disponibles más ejemplos para el enlace de entrada de Azure SQL en el repositorio de GitHub.

En esta sección se incluyen los ejemplos siguientes:

Los ejemplos hacen referencia a una tabla de base de datos:

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

Desencadenador HTTP, obtención de varias filas

En el ejemplo siguiente se muestra un enlace de entrada SQL en un archivo de function.json y una función de PowerShell desencadenada por una solicitud HTTP y lee de una consulta y devuelve los resultados en la respuesta HTTP.

A continuación se muestran los datos de enlace del archivo 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"
}

En la sección de configuración se explican estas propiedades.

A continuación se muestra código de PowerShell de ejemplo para la función en el archivo run.ps1:

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

Desencadenador HTTP, obtención de fila por id. de la cadena de consulta

En el ejemplo siguiente se muestra un enlace de entrada SQL en una función de PowerShell desencadenada por una solicitud HTTP y lee desde una consulta filtrada por un parámetro de la cadena de consulta y devuelve la fila en la respuesta HTTP.

A continuación se muestran los datos de enlace del archivo 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"
}

En la sección de configuración se explican estas propiedades.

A continuación se muestra código de PowerShell de ejemplo para la función en el archivo run.ps1:

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

Desencadenador HTTP, eliminación de filas

En el ejemplo siguiente se muestra un enlace de entrada SQL en un archivo de function.json y una función de PowerShell desencadenada por una solicitud HTTP y ejecuta un procedimiento almacenado con entrada del parámetro de consulta de solicitud HTTP.

El procedimiento almacenado dbo.DeleteToDo debe crearse en la base de datos. En este ejemplo, el procedimiento almacenado elimina un único registro o todos los registros en función del valor del parámetro.

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

En la sección de configuración se explican estas propiedades.

A continuación se muestra código de PowerShell de ejemplo para la función en el archivo run.ps1:

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

Hay disponibles más ejemplos para el enlace de entrada de Azure SQL en el repositorio de GitHub.

En esta sección se incluyen los ejemplos siguientes:

Los ejemplos hacen referencia a una tabla de base de datos:

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

Desencadenador HTTP, obtención de varias filas

En el ejemplo siguiente se muestra un enlace de entrada SQL en un archivo function.json y una función de Python desencadenada por una solicitud HTTP y lee de una consulta y devuelve los resultados en la respuesta HTTP.

A continuación se muestra código python de ejemplo para el archivo 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"
    )

Desencadenador HTTP, obtención de fila por id. de la cadena de consulta

En el ejemplo siguiente se muestra un enlace de entrada SQL en una función de Python desencadenada por una solicitud HTTP y lee desde una consulta filtrada por un parámetro de la cadena de consulta y devuelve la fila en la respuesta HTTP.

A continuación se muestra código python de ejemplo para el archivo 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"
    )

Desencadenador HTTP, eliminación de filas

En el ejemplo siguiente se muestra un enlace de entrada SQL en un archivo de function.json y una función de Python desencadenada por una solicitud HTTP y ejecuta un procedimiento almacenado con entrada del parámetro de consulta de solicitud HTTP.

El procedimiento almacenado dbo.DeleteToDo debe crearse en la base de datos. En este ejemplo, el procedimiento almacenado elimina un único registro o todos los registros en función del valor del parámetro.

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

A continuación se muestra código python de ejemplo para el archivo 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"
    )

Atributos

La biblioteca de C# usa el atributo SqlAttribute para declarar los enlaces SQL en la función, que tiene las siguientes propiedades:

Propiedad de atributo Descripción
CommandText Necesario. El comando de consulta de Transact-SQL o el nombre del procedimiento almacenado ejecutado por el enlace.
ConnectionStringSetting Necesario. El nombre de una configuración de aplicación que contiene la cadena de conexión de la base de datos en la que se va a ejecutar la consulta o el procedimiento almacenado. Este valor no es la cadena de conexión real y, en su lugar, debe resolverse en un nombre de variable de entorno.
CommandType Necesario. Un valor CommandType, que es Text en el caso de una consulta y StoredProcedure en el de un procedimiento almacenado.
Parámetros Opcional. Cero o más valores de parámetro pasados al comando durante la ejecución en forma de cadena individual. Debe seguir el formato @param1=param1,@param2=param2. Ni el nombre ni el valor del parámetro pueden contener una coma (,) o un signo de igual (=).

anotaciones

En la biblioteca de runtime de funciones de Java, utilice la anotación @SQLInput (com.microsoft.azure.functions.sql.annotation.SQLInput) en los parámetros cuyo valor provendría de Azure SQL. Esta anotación admite los siguientes elementos:

Elemento Descripción
commandText Necesario. El comando de consulta de Transact-SQL o el nombre del procedimiento almacenado ejecutado por el enlace.
connectionStringSetting Necesario. El nombre de una configuración de aplicación que contiene la cadena de conexión de la base de datos en la que se va a ejecutar la consulta o el procedimiento almacenado. Este valor no es la cadena de conexión real y, en su lugar, debe resolverse en un nombre de variable de entorno.
commandType Necesario. Un valor CommandType, que es "Text" en el caso de una consulta y "StoredProcedure" en el de un procedimiento almacenado.
name Necesario. Nombre único del enlace de la función.
parameters Opcional. Cero o más valores de parámetro pasados al comando durante la ejecución en forma de cadena individual. Debe seguir el formato @param1=param1,@param2=param2. Ni el nombre ni el valor del parámetro pueden contener una coma (,) o un signo de igual (=).

Configuración

En la tabla siguiente se explican las propiedades que puede establecer en el objeto options que se pasa al métodoinput.sql().

Propiedad Descripción
commandText Necesario. El comando de consulta de Transact-SQL o el nombre del procedimiento almacenado ejecutado por el enlace.
connectionStringSetting Necesario. El nombre de una configuración de aplicación que contiene la cadena de conexión de la base de datos en la que se va a ejecutar la consulta o el procedimiento almacenado. Este valor no es la cadena de conexión real y, en su lugar, debe resolverse en un nombre de variable de entorno. Las palabras clave opcionales del valor de cadena de conexión están disponibles para mejorar la conectividad de los enlaces SQL.
commandType Necesario. Un valor CommandType, que es Text en el caso de una consulta y StoredProcedure en el de un procedimiento almacenado.
parameters Opcional. Cero o más valores de parámetro pasados al comando durante la ejecución en forma de cadena individual. Debe seguir el formato @param1=param1,@param2=param2. Ni el nombre ni el valor del parámetro pueden contener una coma (,) o un signo de igual (=).

Configuración

En la siguiente tabla se explican las propiedades de configuración de enlace que se establecen en el archivo function.json.

Propiedad de function.json Descripción
type Necesario. Se debe establecer en sql.
direction Necesario. Se debe establecer en in.
name Necesario. Nombre de la variable que representa los resultados de la consulta en el código de la función.
commandText Necesario. El comando de consulta de Transact-SQL o el nombre del procedimiento almacenado ejecutado por el enlace.
connectionStringSetting Necesario. El nombre de una configuración de aplicación que contiene la cadena de conexión de la base de datos en la que se va a ejecutar la consulta o el procedimiento almacenado. Este valor no es la cadena de conexión real y, en su lugar, debe resolverse en un nombre de variable de entorno. Las palabras clave opcionales del valor de cadena de conexión están disponibles para mejorar la conectividad de los enlaces SQL.
commandType Necesario. Un valor CommandType, que es Text en el caso de una consulta y StoredProcedure en el de un procedimiento almacenado.
parameters Opcional. Cero o más valores de parámetro pasados al comando durante la ejecución en forma de cadena individual. Debe seguir el formato @param1=param1,@param2=param2. Ni el nombre ni el valor del parámetro pueden contener una coma (,) o un signo de igual (=).

Cuando esté desarrollando localmente, agregue la configuración de la aplicación en el archivo local.settings.json de la colección Values.

Uso

El constructor del atributo toma el texto del comando SQL, el tipo de comando, los parámetros y el nombre del valor de la cadena de conexión. El comando puede ser una consulta Transact-SQL (T-SQL) con el tipo de comando System.Data.CommandType.Text o el nombre del procedimiento almacenado con el tipo de comando System.Data.CommandType.StoredProcedure. El nombre de la configuración de la cadena de conexión se corresponde con la configuración de la aplicación (en local.settings.jsonpara el desarrollo local) que contiene la cadena de conexión a la instancia de Azure SQL o SQL Server.

Las consultas ejecutadas por el enlace de entrada se parametrizan en Microsoft.Data.SqlClient para reducir el riesgo de inyección de código SQL desde los valores de parámetro pasados al enlace.

Si se produce una excepción cuando se ejecuta un enlace de entrada SQL, el código de función no se ejecutará. Esto puede dar lugar a que se devuelva un código de error, como un desencadenador HTTP que devuelve un código de error 500.

Pasos siguientes