'IN'절의 매개 변수에 대한 SQL 제한을 피하기 위해 Dapper를 사용하여 임시 테이블에 삽입 할 ID가 들어있는 List가 있습니다.Dapper를 사용하여 IN 절에서 2100 개가 넘는 값을 사용하려면 어떻게해야합니까?
이public IList<int> LoadAnimalTypeIdsFromAnimalIds(IList<int> animalIds)
{
using (var db = new SqlConnection(this.connectionString))
{
return db.Query<int>(
@"SELECT a.animalID
FROM
dbo.animalTypes [at]
INNER JOIN animals [a] on a.animalTypeId = at.animalTypeId
INNER JOIN edibleAnimals e on e.animalID = a.animalID
WHERE
at.animalId in @animalIds", new { animalIds }).ToList();
}
}
내가 해결해야 할 문제가 2100 개 이상의 ID를 다음 animalIds 목록에있을 때 나는 SQL 오류가 있다는 것입니다 "들어오는 요청도 있습니다
그래서 현재 내 코드는 다음과 같습니다 많은 매개 변수. 서버는 최대 2100 개의 매개 변수를 지원합니다. "그래서 이제 메서드에 전달 된 animalIds로 채워진 임시 테이블을 만들고 싶습니다. 그러면 임시 테이블의 동물 테이블에 가입하고 거대한 "IN"절을 사용하지 않아도됩니다.
다양한 구문 조합을 시도했지만 어디에도 없습니다.
public IList<int> LoadAnimalTypeIdsFromAnimalIds(IList<int> animalIds)
{
using (var db = new SqlConnection(this.connectionString))
{
db.Execute(@"SELECT INTO #tempAnmialIds @animalIds");
return db.Query<int>(
@"SELECT a.animalID
FROM
dbo.animalTypes [at]
INNER JOIN animals [a] on a.animalTypeId = at.animalTypeId
INNER JOIN edibleAnimals e on e.animalID = a.animalID
INNER JOIN #tempAnmialIds tmp on tmp.animalID = a.animalID).ToList();
}
}
내가 ID의 목록과 함께 작업 SELECT INTO를 얻을 수 없습니다 : 내가 지금있는 곳 이입니다. 내가 잘못된 길로 가고 있을지도 모르지만 아마 "IN"절의 한계를 피하는 더 좋은 방법이있을 것입니다.
나는 animalID의 들어오는 목록을 1000 개의 블록으로 나눌 수 있다는 점에서 백업 솔루션을 가지고 있지만 큰 "IN"절이 성능에 영향을 미치고 임시 테이블에 가입하는 것이 더 효율적이며 그것은 또한 내가 돈을 의미합니다; 1000의 블록으로 ID를 일괄 처리하기 위해 별도의 '분할'코드가 필요하지 않습니다.
'INSERT INTO'문은 어디에 있습니까? –
2100 값은 매우 큰 숫자입니다. 적절한 인덱싱을 사용하여 테이블에 저장해야합니다. 이 가치들은 어디서 비롯된 것입니까? 그것들은 질의의 결과입니까? 왜 SELECT 문에 포함시키지 않겠습니까? 아니면 외부 소스 (예 : CSV 파일)에서 왔습니까? 그런 다음 가장 좋은 방법은 파일을 스테이징 테이블로 가져온 다음 해당 테이블에 결합하는 것입니다. –
이들은 CSV –