어퍼 (UPSERT)를 사용하여 데이터 세트에서 작업하는 것을 시도합니다.

c# dapper sql-server upsert

문제

나는 upsert ID의 컬렉션 (기본 키가 아닌 - 그것은 정체성 int 열) dapper를 사용하는 테이블에 대한 작업을 위해 노력하고있어. 이것은 대담한 기능 일 필요 는 없으며 단지 도움이되는 경우를 포함합니다.

그것은 ID의 컬렉션 (특히 int의 IEnumerable 에 upsert를 실행하는 것이 가능한지 (직선 SQL을 통해 또는 대퍼 함수를 ​​사용하여) 궁금합니다.

정말 간단한 예제 만 있으면 시작할 수 있습니다. 예를 들면 다음과 같습니다.


Foo 유형의 세 객체가 있습니다.

  1. { "ExternalID": 1010101, "DescriptorString": "설명 문자열입니다.", "OtherStuff": "이것은 다른 것들입니다."}
  2. { "ExternalID": 1010122, "DescriptorString": "설명적인 문자열 123입니다.", "OtherStuff": "이것은 다른 stuff123입니다."}
  3. { "ExternalID": 1033333, "DescriptorString": "설명 문자열입니다 .555", "OtherStuff": "다른 stuff555입니다"}

Bar라는 테이블이 있으며 같은 열 이름 (1033333 만 존재)이 있습니다.

테이블 Foo
ID | 외부 ID | DescriptorString | 기타
[1] | [1033333] | [ "나는 설명하는 문자열 555"] | [ "이것은 다른 물건들입니다 555"]


인기 답변

글쎄, 당신이 내가 가장 빠르고 깨끗한 방법은이 데이터가 upserted받을 것을 말할 것이다, ;-) 날씬한 기반해야하지 않았다고 말했다 때문에 SQL 서버에 도입 된 테이블 반환 매개 변수 (TVPs)를 사용하는 것입니다 구조를 정의하기 위해 사용자 정의 테이블 형식 (한 번)을 작성해야합니다. 그런 다음 임의의 임시 쿼리에서 사용하거나 저장 프로 시저에 전달할 수 있습니다. 그러나 이렇게하면 가져 오기 위해 파일로 내보낼 필요가 없으며 XML로 변환하여 테이블로 다시 변환 할 필요가 없습니다.

커다란 코드 블록을 복사 / 붙여 넣기하기보다는 아래 코드에서 3 가지 링크를 언급했다. 첫 번째 두 링크는이를 수행하기위한 전체 코드 (SQL 및 C #)입니다 (두 번째 링크는 수행하려는 것과 가장 유사합니다). 각각 테마에 약간의 변형이 있습니다 (TVP 사용의 유연성을 보여줍니다). 세 번째는 다른 변형이지만 전체 코드가 아닌 것은 특정 상황에 맞는 첫 번째 두 개 중 하나의 차이점을 보여주기 때문입니다. 그러나 3 가지 경우 모두 데이터가 앱에서 SQL Server로 스트리밍됩니다 . 추가 수집이나 외부 파일을 만들지 않습니다. 현재 가지고있는 것을 사용하고 한 번에 하나의 행의 값을 복제하면됩니다. SQL Server 측면에서는 모두 채워진 테이블 변수로 처리됩니다. 이것은 이미 메모리에있는 데이터를 파일로 변환 (시간과 디스크 공간 소요) 또는 XML (CPU 및 메모리 사용) 또는 DataTable ( SqlBulkCopy , CPU 및 메모리 사용) 또는 다른 용도로 사용하는 것보다 훨씬 효율적입니다. 파일 시스템과 같은 외부 요소 (파일을 정리해야합니다.)에 의존하거나 XML을 파싱해야합니다.

이제 MERGE 명령을 사용 하는 이유가 될 수있는 MERGE 명령 ( SQL Server의 MERGE 문 사용시 주의 사항 참조)에 몇 가지 문제가 있습니다. 그래서 저는 DBA에서 수년 동안 사용해온 "upsert"코드를 게시했습니다 .StackExchange :



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow