Table Types
The TableType class in Weasel.SqlServer.Tables manages user-defined table types, commonly used for table-valued parameters in stored procedures.
Defining a Table Type
cs
var identifier = DbObjectName.Parse(SqlServerProvider.Instance, "dbo.OrderItemType");
var tableType = new TableType(identifier);
tableType.AddColumn<int>("product_id").NotNull();
tableType.AddColumn<int>("quantity").NotNull();
tableType.AddColumn("unit_price", "decimal(10,2)");Column Configuration
AddColumn returns an ITableTypeColumn that supports:
AllowNulls()-- column accepts NULL valuesNotNull()-- column rejects NULL values (default)
You can add columns by .NET type or by explicit database type string:
cs
tableType.AddColumn<string>("name"); // maps to varchar(100)
tableType.AddColumn("notes", "nvarchar(max)"); // explicit typeGenerating DDL
cs
var migrator = new SqlServerMigrator();
var writer = new StringWriter();
tableType.WriteCreateStatement(migrator, writer);
// Output: CREATE TYPE dbo.OrderItemType AS TABLE (product_id int NOT NULL, ...)Delta Detection
TableTypeDelta compares expected and actual column definitions by querying sys.table_types and sys.columns:
cs
await using var conn = new SqlConnection(connectionString);
await conn.OpenAsync();
var delta = await tableType.FindDeltaAsync(conn);
// delta.Difference: None, Create, or UpdateWhen an update is needed, the delta generates a DROP followed by CREATE since SQL Server does not support ALTER TYPE.
Using with Stored Procedures
Table types enable passing structured data to stored procedures:
sql
CREATE PROCEDURE dbo.InsertOrderItems
@Items dbo.OrderItemType READONLY
AS
BEGIN
INSERT INTO order_items (product_id, quantity, unit_price)
SELECT product_id, quantity, unit_price FROM @Items;
END;