过程中表值参数中的标识列,如何定义DataTable

时间:2010-07-09 08:15:23

标签: sql-server-2008 ado.net table-valued-parameters

是否可以将类型为“[int] IDENTITY(1,1)”的列的“table”类型的参数传递给过程,并使用作为输入参数传递的DataTable对象执行此存储过程? / p>

我收到以下错误:“INSERT到表变量上不允许的标识列。 表值参数\“@ xxxxx \”的数据不符合参数的表类型。“

我能找到的唯一相关注释是“如果在表值参数中为标识列提供值,则必须为会话发出SET IDENTITY_INSERT语句。”

似乎即使PK没有在table参数中设置,它也会在某个时刻自动设置。这种情况发生在哪里?如何避免?

2 个答案:

答案 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?”然后我将不得不要求更多的代码。