go-mssqldb ile tablo değerli parametreler

Tablo değerli parametreler (TVP), bir depolanmış prosedüre veya parametreli sorguya birden fazla yapılandırılmış veri satırını iletmenize olanak tanır. go-mssqldb sürücüsü, TVP'yi mssql.TVP türü aracılığıyla destekler.

Güçlü tipli bir sıra kümesini depolanmış bir prosedür veya komuta aktarmanız ve sütun düzeyindeki yapıyı korumanız gerektiğinde TVP'leri kullanın. Hedef tabloya en yüksek verimli yol için Toplu işlemler kullanın. Eğer yükünüz iç içe veya uygulama katmanında zaten JSON şeklindeyse, JSON ve XML verisi kullanın.

Prerequisites

Kullanıcı tanımlı bir tablo tipi ve bunu kabul eden bir saklanan prosedür oluşturun:

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

TVP satırları için Go yapısını tanımlayın

Kullanıcı tanımlı tablo tipindeki sütunlarla eşleşen bir Go yapı tipi oluşturun:

type DepartmentRow struct {
    Name      string
    GroupName string
}

Bir TVP'yi depolanmış bir prosedüre geçirin

Tip adı ve yapı dilimi ile bir mssql.TVP değer oluşturun, ardından bunu parametre olarak iletebilirsiniz:

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
}

Fonksiyonu çağırın:

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)

Sütun-alan haritalama

Sürücü, TVP sütunlarını yapı alanlarına konuma göre (isme göre değil) eşler. İlk yapı alanı tablo tipindeki ilk sütuna, ikinci alan ikinci sütuna, üçüncü alan üçüncü sütuna eşlenir ve bu şekilde tablo tipindeki tüm sütunlar için böyle devam eder.

Bir sütunu atlamak için struct etiketleri kullanamazsınız. Go tipinizi kullanıcı tanımlı tablo tipindeki sütun sırasına uyacak şekilde yeniden sıralayın veya yeniden yapılandırın.

Desteklenen alan türleri

TVP yapı alanları, normal parametrelerle aynı Go tiplerini destekler:

Go alan türü SQL Server sütun tipi
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

Boş TVP

Boş bir dilim verebilirsiniz. Saklanan prosedür, sıfır satırlı bir tablo alır:

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

Şema nitelikli tip adı

TypeName kullanıcı tarafından tanımlanan tablo tipi adı olmalıdır (hedef tablo adı veya saklanan prosedür adı değil). Tablo tipi varsayılan olmayan bir şemadaysa, şemayı TypeName içine ekleyin:

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