Dapper가 삽입 된 행 ID를 여러 개 반환 할 수없는 이유는 무엇입니까?

.net c# dapper sql-server

문제

행을 삽입 할 수있는 SQL Server 테이블이 있습니다.

var sql = @"
DECLARE @InsertedRows AS TABLE (Id BIGINT);
INSERT INTO Person ([Name], [Age]) OUTPUT Inserted.Id INTO @InsertedRows
VALUES (@Name, @Age);
SELECT Id FROM @InsertedRows;";

Person person = ...;

var id = connection.Query<long>(sql, person).First();

그러나 여러 항목을 삽입하고 삽입 된 모든 ID를 반환하려고하면이 모든 것이 잘 작동합니다.

IEnumerable<Person> people = ...;    
var ids = connection.Query<long>(sql, people);

오류가 발생했습니다.

System.InvalidOperationException :이 컨텍스트에서 매개 변수 (배열, 목록 등)의 열거 형 시퀀스가 ​​허용되지 않습니다.
Dapper.SqlMapper.GetCacheInfo (Identity identity, Object exampleParameters, Boolean addToCache)
Dapper.SqlMapper.d__23`1.MoveNext ()
--- 예외가 발생한 이전 위치의 스택 추적 끝 ---

Dapper에서 삽입 된 ID를 여러 개 반환하는 방법은 무엇입니까?

수락 된 답변

뭔가 어딘가에서 반복해야합니다. 한 행을 삽입하고 목록에서 코드를 보내는 SQL 문이 있습니다. 문자열 리터럴에서 SQL을 좋아하기 때문에 한 번에 한 사람 씩 삽입하고 C #에 루프를 넣은 다음 SELECT SCOPE_IDENTITY() 사용하여 C #에서 각 ID를 복구해야합니다. @InsertedRows 또는 OUTPUT이 더 이상 필요하지 않습니다.

SQL로 루프를 만들고 싶다면 삽입 목록을 전달하기 위해 테이블 ​​값 매개 변수를 살펴볼 필요가 있다고 생각합니다. Dapper는 여러 ID를 반환하게되어 매우 기쁩니다. 입력 매개 변수로 여러 사람에 대해 불평하고 있습니다.

언젠가 곧, 우리는 염소 희생을 바라 보는 것처럼 문자열 리터럴에서 SQL을 되돌아 볼 것입니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.