4

"[int] IDENTITY(1,1)" 型の列を持つ "table" 型のパラメーターをプロシージャに渡し、入力パラメーターとして渡された DataTable オブジェクトを使用してこのストアド プロシージャを実行することは可能ですか?

次のエラーが表示されます:「ID 列への INSERT は、テーブル変数では許可されていません。テーブル値パラメーター \"@xxxxx\" のデータは、パラメーターのテーブル型に準拠していません。」

私が見つけた唯一の関連コメントは、「テーブル値パラメーターで ID 列の値を指定する場合は、セッションに対して SET IDENTITY_INSERT ステートメントを発行する必要があります」でした。

table パラメーターに PK が設定されていなくても、ある時点で自動的に設定されるようです。それはどこで起こり、どのように回避できますか?

4

2 に答える 2

7

タイプのIDが必要であるが、値を提供したくないという同じ問題がありました。重要なのは、次のように設定するSqlMetaData列のコンストラクターを使用することです。useServerDefaulttrue

この記事によると、Tim Van Wassenhove による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)
于 2012-04-17T14:53:34.193 に答える
1

質問が「INT IDENTITY(1,1) とマークされた列を持つ TVP を渡すにはどうすればよいですか?」あなたはそうしない。TVP はテーブルではありません。TVP 値を指定している可能性があります。これは、提供している値に ID が必要ないことを意味します。

テーブルは、通常、IDENTITY を宣言したいテーブルです。

質問が「TVP で PK を設定しないようにするにはどうすればよいですか?」その後、さらにコードを要求する必要があります。

于 2011-03-18T14:57:27.373 に答える