복잡한 유형의 객체 목록을 SQL Server로 보내는 방법
문제.
그래서 여러분들이 같은 채널에 접속할 수 있도록 배경 지식을 드리겠습니다.
이 특정 프로젝트의 경우 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로 변환되며, 서열화되고, 문자열로 발송됩니다.
우리는 그것들을 어떻게 사용합니까?
테이블 값 매개변수를 사용하려면 다음 세 단계를 완료해야 합니다.
사용자정의 테이블 유형 만들기
이것이 바로 우리가 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
방법을 실행한 결과를 변수에 저장하고 값을 추출하기 위해 처리해야 한다.중요한 힌트
나는 너에게 알려줄 가치가 있다고 생각하기 때문에 이 부분을 업데이트의 일부분으로 추가했다.테이블 값 매개변수를 사용할 때 다음과 같은 몇 가지 제한 사항과 중요한 사항을 고려해야 합니다.
결론
내가 이 점을 알기 전에, 나는 줄곧 여러 줄의 데이터를 SP에 보내고, 데이터를 XML로 서열화한 다음에 SQL Server에서 다시 반서열화하기 어려웠다. 앞에서 언급한 바와 같이.이것은 틀리지 않았지만, 서열화/반서열화 부분에 오류를 삽입할 수 있습니다.나는 개인적으로 이 방법의 유형이 더욱 강하다는 것을 발견했다. 이것은 좋은 일이다. 왜냐하면 너는 번역할 때 많은 버그를 포착할 수 있기 때문이다.
너는?이게 존재하는 거 알아요?이것 괜찮아요?이전에 SQL Server에 복잡한 유형의 객체 목록을 보내야 하는 경우가 있었습니까?당신은 어떻게 이 문제를 해결했습니까?
나는 이 책이 그것을 읽는 모든 사람에게 유용하길 바란다.만약 어떤 의견이 있으면 아래의 평론 부분에 남겨 주십시오.고마워요!
읽어주셔서 감사합니다. 다음 문장 안녕히 계세요!
Reference
이 문제에 관하여(복잡한 유형의 객체 목록을 SQL Server로 보내는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/edwinoaragon/how-to-send-a-complex-type-list-of-objects-to-sql-server-266b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)