是否可以将类型为“[int] IDENTITY(1,1)”的列的“table”类型的参数传递给过程,并使用作为输入参数传递的DataTable对象执行此存储过程? / p>
我收到以下错误:“INSERT到表变量上不允许的标识列。 表值参数\“@ xxxxx \”的数据不符合参数的表类型。“
我能找到的唯一相关注释是“如果在表值参数中为标识列提供值,则必须为会话发出SET IDENTITY_INSERT语句。”
似乎即使PK没有在table参数中设置,它也会在某个时刻自动设置。这种情况发生在哪里?如何避免?
答案 0 :(得分:7)
我遇到同样的问题,我们想要在类型上使用标识,但不想提供值。关键是对该列使用SqlMetaData
构造函数,将useServerDefault
设置为true
:
根据Tim Van Wassenhove撰写的using user defined table type with identify column in ado net文章
<强> SQL 强>:
CREATE TYPE [Star].[example] AS TABLE(
[Ordinal] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](200) NOT NULL,
)
<强> C#强>:
var sqlMetaData = new[]
{
new SqlMetaData("Ordinal", SqlDbType.Int, true, false, SortOrder.Unspecified, -1),
new SqlMetaData("Name", SqlDbType.NVarChar, 200)
};
sqlRecords = new HashSet<SqlDataRecord>(usersToInclude.Select(user =>
{
var record = new SqlDataRecord(sqlMetaData);
record.SetString(1, user.Name);
return record;
}));
new SqlMetaData("IdentityField", SqlDbType.Int, true, false, SortOrder.Unspecified, -1)
答案 1 :(得分:1)
如果问题是“如何通过带有标记为INT IDENTITY(1,1)的列的TVP?”你没有。 TVP不是桌子。您可能正在指定TVP值,这意味着您不希望在您提供的值上使用身份。
该表通常是您要在其上声明IDENTITY的表。
如果问题是“如何避免在TVP中设置PK?”然后我将不得不要求更多的代码。