Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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,
}