Tabulkové parametry s go-mssqldb

Tabulkové parametry (TVP) umožňují předávat více řádků strukturovaných dat do uložené procedury nebo parametrizovaného dotazu. Ovladač go-mssqldb podporuje TVP prostřednictvím typu mssql.TVP.

Používejte TVP, když potřebujete předat silně zadaný řádkový soubor do uložené procedury nebo příkazu a zachovejte strukturu na úrovni sloupců. Pro cestu s nejvyšší propustností do cílové tabulky použijte hromadné operace. Pokud je payload vnořený nebo už má v aplikační vrstvě formát JSON, použijte data JSON a XML.

Prerequisites

Vytvořte uživatelsky definovaný typ tabulky a uloženou proceduru, která jej přijímá:

CREATE TYPE dbo.DepartmentType AS TABLE (
    Name NVARCHAR(50),
    GroupName NVARCHAR(50)
);
GO

CREATE PROCEDURE dbo.InsertDepartments
    @departments dbo.DepartmentType READONLY
AS
BEGIN
    INSERT INTO HumanResources.Department (Name, GroupName)
    SELECT Name, GroupName FROM @departments;
END;
GO

Definujte strukturu Go pro řádky TVP

Vytvořte strukturální typ Go, který odpovídá sloupcům v uživatelsky definované tabulce:

type DepartmentRow struct {
    Name      string
    GroupName string
}

Předat TVP uložené proceduře

Vytvořte mssql.TVP hodnotu s názvem typu a výsekem struktur, poté ji předejte jako parametr:

import (
    "context"
    "database/sql"

    "github.com/microsoft/go-mssqldb"
)

func insertDepartments(ctx context.Context, db *sql.DB, departments []DepartmentRow) error {
    tvp := mssql.TVP{
        TypeName: "dbo.DepartmentType",
        Value:    departments,
    }

    _, err := db.ExecContext(ctx, "dbo.InsertDepartments",
        sql.Named("departments", tvp))
    return err
}

Nazvěte funkci:

departments := []DepartmentRow{
    {Name: "Data Science", GroupName: "Research and Development"},
    {Name: "Cloud Ops", GroupName: "Information Technology"},
    {Name: "Developer Relations", GroupName: "Sales and Marketing"},
}
err := insertDepartments(ctx, db, departments)

Mapování sloupců na pole

Řidič mapuje sloupce TVP na strukturované pole podle pozice (nikoli podle jména). První pole struktury se mapuje na první sloupec v typu tabulky, druhé pole na druhý sloupec, třetí pole na třetí sloupec a tak dále pro všechny sloupce v daném typu tabulky.

Pro přeskočení sloupce nelze použít struct tagy. Přeuspořádejte nebo přestrukturalizujte svůj typ Go tak, aby odpovídal pořadí sloupců v uživatelsky definovaném typu tabulky.

Podporované typy polí

Pole TVP struktur podporují stejné typy Go jako běžné parametry:

Typ hřiště Go Typ sloupce SQL Server
string nvarchar
mssql.VarChar varchar
int64, int32, , int16int8 bigint, int, , smallinttinyint
float64, float32 float, real
bool bit
time.Time datetimeoffset
[]byte varbinary
mssql.UniqueIdentifier uniqueidentifier

Prázdné TVP

Můžete předat prázdný plátek. Uložená procedura přijímá tabulku s nulovým řádkem:

tvp := mssql.TVP{
    TypeName: "dbo.DepartmentType",
    Value:    []DepartmentRow{},
}

Typové jméno kvalifikované pro schéma

TypeName musí být uživatelsky definovaný název typu tabulky (nikoli název cílové tabulky nebo název uložené procedury). Pokud je typ tabulky v nevýchozím schématu, zahrňte schéma do TypeName:

tvp := mssql.TVP{
    TypeName: "HumanResources.DepartmentType",
    Value:    departments,
}