如何将集合保存为具有自动增量列的用户定义数据类型

本文关键字:定义数据类型 用户 集合 保存 | 更新日期: 2023-09-27 17:51:14

假设我必须将具有五列的datatable保存到具有6列的用户定义的表类型变量。第一列是自动递增的从1开始递增1

结构如下:

create type dbo.SelectedCourses
as table
(
    CntrNo int not null IDENTITY(1, 1), 
    CRSID int,
    YearNo int,
    IsCompulsory varchar(20),
    EntDT datetime,
    EmpID int
);
go

stored procedure中它被声明为:

create proc USPSvUpdtACDProgramFromTypes
-- has global variables above
@pSelCRSInfo as dbo.SelectedCourses READONLY
-- has global variables here
as
begin 
  -- code here
end

我的问题是如何在具有5列的客户端构建datatable并将其添加到六列的UDTT变量(首先是auto increment)。如果我分配它而不考虑列计数,datatable的第一列将映射到自动增量列,SQL将抛出一个错误。

谢谢

如何将集合保存为具有自动增量列的用户定义数据类型

您可以使用SqlMetaData

下面是一个完整的UDTT示例:

CREATE TYPE [dbo].[test_table] AS TABLE(
    ID int identity (1,1) NOT NULL,
    Name varchar(50) NOT NULL
)

使用SqlMetaData

var sqlMetaData = new[] 
{
  new SqlMetaData("ID", SqlDbType.Int, true, false, SortOrder.Unspecified, -1),
  new SqlMetaData("Name", SqlDbType.NVarChar, 50)
};
var sqlRecords = new HashSet<SqlDataRecord>();
var sqlRec = new SqlDataRecord(sqlMetaData);
sqlRec.SetString(1, "Nyan");
sqlRecords.Add(sqlRec);
var conn = new SqlConnection("connstring");
try
{
    conn.Open();           
    using (var cmd = new SqlCommand("tests", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        var param = new SqlParameter("@tbl", SqlDbType.Structured) { Value = sqlRecords };
        cmd.Parameters.Add(param);
        cmd.ExecuteNonQuery();
    }
}
catch (Exception ex)
{
    Console.WriteLine("Error in tests.");
    Console.WriteLine(ex.Message);
}
finally
{
    if (conn.State == ConnectionState.Open)
        conn.Close();
}