Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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,
}