복잡한 유형의 객체 목록을 SQL Server로 보내는 방법

여보게, 동네, 나 돌아왔어!이번에는 최근 SQL Server 및 C# 사용 시 발생한 문제를 해결하는 방법을 여러분과 공유하고 싶습니다.

문제.
그래서 여러분들이 같은 채널에 접속할 수 있도록 배경 지식을 드리겠습니다.
이 특정 프로젝트의 경우 SQL Server 및 ASP를 사용합니다.NETMVC5.ADO를 통해 데이터베이스 연결을 관리합니다.그물나는 주로 저장 프로세스를 통해 데이터베이스로 하여금 데이터의 부하를 처리하게 한다.여러 줄을 수정해야 할 때, 나는 항상 내가 사용하고자 하는 ID를 포함하는 쉼표로 구분된 문자열을 보낸다.
다음은 수정할 ID 목록을 보내는 방법에 대한 예입니다.
CREATE PROCEDURE 
    /*This will contain a comma separated list e.g 1,2,3,4,5 and so on*/
    @idList varchar(MAX)
AS
BEGIN
     --Do something useful with @idList
END
하지만 이번에는 ID뿐만 아니라 복잡한 유형의 요소 목록도 보내야 합니다.나는 일찍이 이렇게 한 적이 있다. 그러나 그때 나는 복잡한 유형을 XML로 서열화하여 데이터베이스에 문자열로 보내고 데이터베이스에서 XML을 반서열화했다. (왜 XML이 JSON이 아닌 XML인지 알고 싶을 수도 있다. 내가 사용하는 SQL Server 버전은 SQL Server 2008이기 때문에 이 버전은 아직 사용할 수 있는 JSON이 없다.)필요이것은 듣기에 많은 일을 해야 한다고 들리지 않습니까?그래서 더 쉽게 처리할 수 있는 게 있는지 찾아보기로 했어요.

해결 방안: 테이블 값 파라미터를 구조에 사용합니다!
솔루션을 검색할 때 스토리지 프로세스를 위해 SQL Server에 매개 변수를 전송하는 흥미로운 방법을 발견했습니다.그러나 무엇이 표값 매개 변수입니까?
말 그대로 표 값 매개 변수는 특수한 매개 변수로 저장 프로세스에 보낼 수 있고 저장 프로세스는 우리가 정의한 특정한 구조표를 저장할 수 있다.기본적으로, 당신은 표를 매개 변수로 저장 프로세스에 보낼 수 있는데, 이게 무슨 소용이 있습니까?
안녕히 계세요. 긴 매개 변수 목록이나 id 목록은 문자열이나 복잡한 형식으로 발송되고, XML로 변환되며, 서열화되고, 문자열로 발송됩니다.

우리는 그것들을 어떻게 사용합니까?
테이블 값 매개변수를 사용하려면 다음 세 단계를 완료해야 합니다.
  • 사용자 정의 테이블 형식을 만듭니다.
  • 저장 프로세스를 만듭니다. 우리는 그 중에서 표 값 파라미터를 사용하고 최근에 만든 사용자 정의 표 유형을 사용할 것입니다.
  • ADO 구성NET는 매개변수를 특수 매개변수로 보냅니다.
  • 우리 한 걸음 한 걸음 분해합시다.우리가 한 영화의 웹 응용 프로그램을 사용하고 있다는 것을 상상해 봅시다. 이 응용 프로그램에서 당신은 한 번의 조작을 통해 영화를 다른 영화관에 분배할 수 있습니다.

    사용자정의 테이블 유형 만들기
    이것이 바로 우리가 SQL Server에 우리가 표 값 매개 변수에 보내고자 하는 구조를 알려주는 방식입니다. 표 값 매개 변수를 만드는 것은 매우 간단합니다.
    우리가 그것을 어떻게 구축해야 하는지 봅시다.
    CREATE TYPE <schema>.<name of the type> AS TABLE
    (
       <ColumnName> <Colum type>
    )
    GO
    
    예를 들면 다음과 같습니다.
    CREATE TYPE dbo.MovieAssignment AS TABLE
    (
        MovieId INT,
        Order TINYINT,
        MovieTheaterId INT
    )
    GO
    

    저장 프로세스를 만들고, 우리는 그 중에서 표 값 파라미터를 사용할 것이다
    그런 다음 SP에서 방금 생성한 사용자 정의 테이블 유형을 사용하여 테이블 값 매개 변수를 SP로 보내야 합니다.일반 SP와 동일한 구조입니다.
    CREATE PROCEDURE <schema>.<name of the type>
    (
        @<parameter name> <user-defined table type> READONLY
    )
    AS 
    BEGIN
       -- SP's body
    END
    
    여기서 주의해야 할 점은 SQL Server가 테이블 값 매개 변수라는 것을 알리기 위해 매개 변수 유형 뒤에 READONLY 키워드를 추가해야 한다는 것입니다.
    영화의 응용 프로그램 예시로 돌아가서 다음과 같이 SP를 정의할 수 있습니다.
    CREATE PROCEDURE dbo.PersistMovieAssignments
    (
        @MovieAssignments dbo.MovieAssignment READONLY
    )
    AS 
    BEGIN
       -- SP's body
    END
    

    ADO를 구성합니다.NET는 매개변수를 특수 매개변수로 보냅니다.
    마지막 단계는 C# 코드에서 SP에 대한 호출을 구성하여 우리가 보낸 매개 변수가 특수한 테이블 값 매개 변수라는 것을 알리는 것입니다.
    우리가 고려해야 할 첫 번째 일은 파라미터를 DataTable로 보내고 파라미터 유형을 Structured로 표시해야 한다는 것이다. 이것은 ADO에 알려줄 것이다.NET에서 신호를 보냅니다. 이 매개 변수는 테이블 값 매개 변수입니다.
    우리 예를 하나 봅시다.
    using (var sqlConnection = new SqlConnection(/*Our connection string*/))
    {
       sqlConnection.Open();
       /*Create the SqlCommand object to tell SQL what we want to execute, in our case is a stored procedure.*/
       var sqlCommand = new SqlCommand("dbo.PersistMovieAssignments", sqlConnection)
       {
          CommandType = CommandType.StoredProcedure
       };
       /*Then we create DataTable we want to send as table-valued parameter*/
       var movieAssignments = new DataTable();
       movieAssignments.Columns.Add("MovieId", typeof(int));
       movieAssignments.Columns.Add("Order", typeof(int));
       movieAssignments.Columns.Add("MovieTheaterId", typeof(int));
    
       /*Add the data to the DataTable object*/
       movieAssignments.Rows.Add(1, 1, 1);
       movieAssignments.Rows.Add(1, 2, 2);
       movieAssignments.Rows.Add(1, 5, 3);
    
       /*Then we create the SqlParameter object where we are going to assign the DataTable containing the data we want to send to SQL Server*/
       SqlParameter movieAssignmentsParameter = sqlCommand.Parameters.AddWithValue("@MovieAssignments", movieAssignments);
       movieAssignmentsParameter.SqlDbType = SqlDbType.Structured;
    
       /*Then we just execute our command*/
       sqlCommand.ExecuteReader();
    }
    
    PersistMovieAssignments 저장 과정 중 어떤 종류의 값을 되돌려주면 ExecuteReader 방법을 실행한 결과를 변수에 저장하고 값을 추출하기 위해 처리해야 한다.

    중요한 힌트
    나는 너에게 알려줄 가치가 있다고 생각하기 때문에 이 부분을 업데이트의 일부분으로 추가했다.테이블 값 매개변수를 사용할 때 다음과 같은 몇 가지 제한 사항과 중요한 사항을 고려해야 합니다.
  • ADO 사용 시.Net에서 테이블 값 매개 변수를 사용할 경우 데이터베이스로 전송되는 데이터 테이블의 열 순서는 사용자가 정의한 테이블 유형에 정의된 열 순서와 일치해야 합니다.(소중한 힌트 감사합니다).
  • 테이블 값 매개 변수는 Transact-SQL 코드에서 읽기만 합니다.테이블 값 매개변수 행의 열 값을 업데이트하거나 행을 삽입하거나 삭제할 수 없습니다.테이블 값 매개 변수에 전달되는 저장 프로세스나 매개 변수화 문장의 데이터를 수정하려면 임시 테이블이나 테이블 변수에 데이터를 삽입해야 한다.
  • Alter TABLE 문을 사용하여 테이블 값 매개변수의 설계를 수정할 수 없습니다.
  • 제한과 값 매개 변수에 대한 정보를 더 알고 싶으면 공식 버전 documentation 부터 시작하는 것이 좋습니다.

    결론
    내가 이 점을 알기 전에, 나는 줄곧 여러 줄의 데이터를 SP에 보내고, 데이터를 XML로 서열화한 다음에 SQL Server에서 다시 반서열화하기 어려웠다. 앞에서 언급한 바와 같이.이것은 틀리지 않았지만, 서열화/반서열화 부분에 오류를 삽입할 수 있습니다.나는 개인적으로 이 방법의 유형이 더욱 강하다는 것을 발견했다. 이것은 좋은 일이다. 왜냐하면 너는 번역할 때 많은 버그를 포착할 수 있기 때문이다.
    너는?이게 존재하는 거 알아요?이것 괜찮아요?이전에 SQL Server에 복잡한 유형의 객체 목록을 보내야 하는 경우가 있었습니까?당신은 어떻게 이 문제를 해결했습니까?
    나는 이 책이 그것을 읽는 모든 사람에게 유용하길 바란다.만약 어떤 의견이 있으면 아래의 평론 부분에 남겨 주십시오.고마워요!
    읽어주셔서 감사합니다. 다음 문장 안녕히 계세요!

    좋은 웹페이지 즐겨찾기