Ado.Net에서 테이블 반환 매개 변수를 효율적으로 호출하는 방법

ado.net bulkinsert sqlbulkcopy sql-server sql-server-2008

문제

Ado.Net에서 수천 개의 숫자와 날짜를 효율적으로 SQl Server 2008에 제출해야합니다. 당시 SQL 2008 이전의 이미지에서는 숫자를 패킹하고 있었지만 꽤 빠릅니다. Erland Sommarskog는 자신의 기사 에서 SQL Server 2005의 배열 및 목록에 일부 코드를 포함 할 정도로 친절했습니다.

이제 TVP를 사용할 수 있으므로 사용해 보았습니다. 클라이언트에서 나는 이것을 실행하고있다.

        dataTable = new DataTable();
        dataTable.Columns.Add("Date", typeof(DateTime));
        dataTable.Columns.Add("Price", typeof(decimal));
        dataTable.Rows.Add(new object[] { someDate, somePrice });
            command.CommandText = "Writers.SavePrices";
            command.CommandType = CommandType.StoredProcedure;
            var param = command.Parameters.AddWithValue("@Prices", dataTable);
            param.SqlDbType = SqlDbType.Structured;

이 코드는 작동하지만 효율적이라고 생각하지 않습니다. 프로파일 러를 가동 시켰고 즉시 Ado.Net이 다음과 같이 매우 비효율적 인 SQL을 서버에 보냈다는 것을 알았습니다.

DECLARE @Prices TABLE(...)
INSERT INTO @Prices(...)VALUES(...)
EXEC Writers.SavePrices @Prices=@Prices

결과적으로 서버의 많은 네트워크 대역폭과 CPU가 전송, 구문 분석 및 컴파일시 낭비됩니다. Ado.Net에서 TVP를 사용하는보다 효율적인 방법이 있습니까?

수락 된 답변

SqlBulkCopy 를 알고 있습니까? 매우 효율적이고 유연합니다. 다음 은 그 예입니다.

나는 이것을 TVP의 대안으로 언급했다. TVP와 비교하여 SQLBulkCopy에 대한 더 흥미로운 정보는 여기여기 를보십시오.

(의견에서 복사)



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