过程中的表值参数中的Identity列,如何定义DataTable [英] Identity column in a table-valued parameter in procedure, how to define DataTable

查看:162
本文介绍了过程中的表值参数中的Identity列,如何定义DataTable的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我收到以下错误:表变量中不允许插入身份列。
表值参数data的数据 @ xxxxx\ 不符合参数的表类型。



我唯一能找到的相关注释是如果您在一个表值参数,则必须为该会话发出SET IDENTITY_INSERT语句。



看来,即使未在table参数中设置PK,它也会在某个时候自动设置。

解决方案

我遇到了同样的问题,我们想要在类型上使用标识,但不想提供价值。关键是对该列使用 SqlMetaData 构造函数,该列将 useServerDefault 设置为 true



根据使用用户定义的表类型和ado net中的identify列,由Tim Van Wassenhove



SQL

 创建TYPE [Star]。[示例] 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),
新的SqlMetaData( Name,SqlDbType.NVarChar,200)
};

sqlRecords = new HashSet< SqlDataRecord>(usersToInclude.Select(user =>
{
var record = new SqlDataRecord(sqlMetaData);
record.SetString( 1,user.Name);
返回记录;
}));

新SqlMetaData( IdentityField,SqlDbType.Int,true,false,SortOrder.Unspecified,-1)


Is it possible to pass a parameter of type "table" with a column of type "[int] IDENTITY(1,1)" to a procedure and execute this stored procedure with a DataTable object passed as the input parameter?

I get the following error: "INSERT into an identity column not allowed on table variables. The data for table-valued parameter \"@xxxxx\" doesn't conform to the table type of the parameter."

The only related comment I was able to find was "If you supply a value for an identity column in a table-valued parameter, you must issue the SET IDENTITY_INSERT statement for the session."

It seems that even though the PK was not set in the table parameter, it gets set automatically at some point. Where does that happen and how can it be avoided?

解决方案

I had this same problem where we want an identity on the type, but don't want to provide a value. The key is to use a SqlMetaData constructor for that column that sets useServerDefault to true:

According to this article on using user defined table type with identify column in ado net by Tim Van Wassenhove

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)

这篇关于过程中的表值参数中的Identity列,如何定义DataTable的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆