Parameter bernilai tabel dengan go-mssqldb

Parameter bernilai tabel (TVP) memungkinkan Anda meneruskan beberapa baris data terstruktur ke prosedur tersimpan atau kueri berparameter. go-mssqldb driver mendukung TVP melalui tipe mssql.TVP.

Gunakan TVP saat Anda perlu meneruskan kumpulan baris yang diketik dengan kuat ke dalam prosedur atau perintah tersimpan dan mempertahankan struktur tingkat kolom. Untuk jalur throughput tertinggi ke tabel tujuan, gunakan Operasi massal. Jika payload Anda berlapis atau sudah berbentuk JSON di lapisan aplikasi, gunakan data JSON dan XML.

Prasyarat

Buat jenis tabel yang ditentukan pengguna dan prosedur tersimpan yang menerimanya:

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

Menentukan struktur Go untuk baris TVP

Buat jenis struktur Go yang cocok dengan kolom dalam jenis tabel yang ditentukan pengguna:

type DepartmentRow struct {
    Name      string
    GroupName string
}

Teruskan TVP ke prosedur tersimpan

Buat nilai mssql.TVP dengan nama tipe dan slice struct, lalu berikan sebagai parameter:

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
}

Panggil fungsinya:

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)

Pemetaan kolom ke bidang

Driver memetakan kolom TVP untuk menyusun bidang berdasarkan posisi (bukan berdasarkan nama). Bidang struktur pertama memetakan ke kolom pertama dalam jenis tabel, bidang kedua memetakan ke kolom kedua, bidang ketiga memetakan ke kolom ketiga, dan seterusnya untuk semua kolom dalam jenis tabel.

Untuk melewati kolom, Anda tidak dapat menggunakan tag struct. Urutkan ulang atau restrukturisasi jenis Go Anda agar sesuai dengan urutan kolom dalam jenis tabel yang ditentukan pengguna.

Jenis bidang yang didukung

Bidang struktur TVP mendukung jenis Go yang sama dengan parameter reguler:

Jenis bidang Go Jenis kolom SQL Server
string nvarchar
mssql.VarChar varchar
int64,int32,int16,int8 bigint,int,smallint,tinyint
float64, float32 float, real
bool bit
time.Time datetimeoffset
[]byte varbinary
mssql.UniqueIdentifier uniqueidentifier

TVP kosong

Anda dapat melewati irisan kosong. Prosedur tersimpan menerima tabel tanpa baris:

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

Nama jenis yang memenuhi syarat skema

TypeName harus berupa nama jenis tabel yang ditentukan pengguna (bukan nama tabel tujuan atau nama prosedur tersimpan). Jika jenis tabel dalam skema non-default, sertakan skema di TypeName:

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