Столбец идентичности в табличном параметре в процедуре, как определить DataTable - PullRequest
3 голосов
/ 09 июля 2010

Можно ли передать в процедуру параметр типа "таблица" со столбцом типа "[int] IDENTITY (1,1)" и выполнить эту хранимую процедуру с объектом DataTable, переданным в качестве входного параметра?

Я получаю следующую ошибку: "INSERT в столбце идентификаторов не допускается для табличных переменных. Данные для табличного параметра \ "@ xxxxx \" не соответствуют типу таблицы параметра. "

Единственный связанный комментарий, который мне удалось найти, был «Если вы указали значение для столбца идентификатора в табличном параметре, вы должны выполнить инструкцию SET IDENTITY_INSERT для сеанса».

Кажется, что, хотя PK не был установлен в параметре таблицы, в какой-то момент он устанавливается автоматически. Где это происходит и как этого избежать?

Ответы [ 2 ]

7 голосов
/ 17 апреля 2012

У меня была такая же проблема, когда мы хотим идентифицировать тип, но не хотим указывать значение.Ключ должен использовать конструктор SqlMetaData для этого столбца, который устанавливает useServerDefault в true:

В соответствии с этой статьей на используется пользовательский тип таблицы с идентификатором столбца в 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 голос
/ 18 марта 2011

Если вопрос «как передать TVP с колонкой, помеченной INT IDENTITY (1,1)?»ты неTVP - это не стол.Возможно, вы указываете значения TVP, что означает, что вы не хотите идентифицировать значение, которое вы предоставляете.

Обычно в таблице указывается IDENTITY.1003 *

Если вопрос «Как я могу избежать установки ПК в TVP?»тогда я должен был бы попросить больше кода.

...