2010-07-09 3 views
2

"[int] IDENTITY (1,1)"유형의 열이있는 "table"형식의 매개 변수를 프로 시저로 전달할 수 있습니까? 이 저장 프로 시저를 입력 매개 변수로 전달 된 DataTable 개체와 함께 실행 하시겠습니까?프로 시저에서 테이블 반환 매개 변수의 식별 열 DataTable 정의 방법

"테이블 변수에 허용되지 않는 ID 열에 대한 INSERT 테이블 반환 매개 변수"@xxxxxx "의 데이터가 매개 변수의 테이블 형식을 따르지 않습니다."

"테이블 값 매개 변수에서 ID 열에 값을 제공하는 경우 세션에 대해 SET IDENTITY_INSERT 문을 실행해야합니다."라는 유일한 주석을 찾을 수있었습니다.

PK가 table 매개 변수에 설정되지 않은 경우에도 특정 시점에서 자동으로 설정됩니다. 그런 일이 벌어지고 어떻게 피할 수 있습니까?

+0

음 오류는 IDENTITY 열에 값을 삽입하려고한다는 것을 나타냅니다. 이는 기본적으로 수행 중이 지 않은 값입니다. SQL Server는 IDENTITY 필드를 단독으로 처리해야합니다. 따라서 INSERT를 변경하여 ** IDENTITY 열의 값을 제공하지 ** 않습니다 ** SQL Server에서 해당 값을 처리하도록하십시오. –

+1

네, 그랬습니다. 값없이 열을 제공했지만 여전히 오류가있었습니다. DataTable에서이 열을 제거하면 열이없는 오류가 발생합니다. – jatto

답변

1

"INT IDENTITY (1,1)로 표시된 열이있는 TVP를 어떻게 전달합니까?" 너는하지 않는다. TVP는 테이블이 아닙니다. TVP 값을 지정할 수도 있습니다. 즉, 제공하는 값에 ID를 사용하지 않으려는 것입니다.

테이블은 일반적으로 IDENTITY를 선언 할 테이블입니다.

"TVP에서 PK를 설정하는 것을 어떻게 피할 수 있습니까?" 그러면 더 많은 코드를 요구해야 할 것입니다.

+0

+1 멋진 포인트. 지속되지 않는 데이터에 기본 키 열을 갖는 것은 아무런 가치가 없습니다. 사용자 정의 테이블 유형에서이를 건너 뛸 수 있으며 [[예제]] (http://stackoverflow.com/q/26938784/1366033)와 같이 마지막 테이블에 선언 할 수 있습니다. – KyleMit

4

유형에 ID를 원하지만 값을 제공하지 않으려는 동일한 문제가있었습니다.

CREATE TYPE [Star].[example] AS TABLE( 
    [Ordinal] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [nvarchar](200) NOT NULL, 
) 

C#을 :

는 SQL

팀 반 Wassenhove에 의해 using user defined table type with identify column in ado net에이 문서에 따르면 핵심은 useServerDefaulttrue에 설정하는 열에 대한 SqlMetaData 생성자를 사용하는 것입니다 :

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) 
+5

실제로 구현하는 방법 이? – scottmgerstl

+1

http://www.timvw.be/2011/07/13/using-user-defined-table-type-with-identity-column-in-ado-net/ –