다음을 통해 공유


매개 변수화된 명령 작업

특히 부모 레코드 집합의 크기에 비해 큰 자식 레코드 집합을 사용하지만 몇 개의 자식 챕터에만 액세스해야 하는 경우 매개 변수가 있는 명령을 사용하는 것이 더 효율적일 수 있습니다.

매개 변수화되지 않은 명령은 전체 부모 및 자식 레코드 집합을 모두 검색하고, 챕터 열을 부모에 추가한 다음, 각 부모 행의 관련 자식 챕터에 참조를 할당합니다.

매개 변수화된 명령은 전체 부모 레코드 집합을 검색하지만 챕터 열에 액세스할 때는 레코드 집합 챕터만 검색합니다. 이러한 검색 전략 차이는 상당한 성능 이점을 제공할 수 있습니다.

예를 들면 다음을 지정할 수 있습니다.

SHAPE {SELECT * FROM customer}   
   APPEND ({SELECT * FROM orders WHERE cust_id = ?}   
   RELATE cust_id TO PARAMETER 0)  

부모 테이블과 자식 테이블에는 cust_id라는 공통 열 이름이 있습니다. child-command에는 RELATE 절이 참조하는 "?" 자리 표시자가 있습니다(즉, "...PARAMETER 0").

참고 항목

PARAMETER 절은 셰이프 명령 구문에만 관련됩니다. ADO Parameter 개체 또는 Parameters 컬렉션과는 연결되지 않습니다.

매개 변수가 있는 셰이프 명령이 실행되면 다음이 발생합니다.

  1. parent-command이 실행되고 Customers 테이블에서 부모 레코드 집합을 반환합니다.

  2. 부모 레코드 집합에 챕터 열이 추가됩니다.

  3. 부모 행의 챕터 열에 액세스하면 customer.cust_id 값을 매개 변수 값으로 사용하여 child-command이 실행됩니다.

  4. 3단계에서 만든 데이터 공급자 행 집합의 모든 행이 자식 레코드 집합을 채우는 데 사용됩니다. 이 예제에서는 Orders 테이블에서 cust_id가 customer.cust_id 값과 동일한 모든 행입니다. 기본적으로 자식 레코드 집합은 부모 레코드 집합에 대한 모든 참조가 해제될 때까지 클라이언트에 캐시됩니다. 이 동작을 변경하려면 Recordset 동적 속정 Cache Child RowsFalse로 설정합니다.

  5. 검색된 자식 행(즉, 자식 레코드 집합의 챕터)에 대한 참조는 부모 레코드 집합의 현재 행에 있는 챕터 열에 배치됩니다.

  6. 다른 행의 챕터 열에 액세스하면 3~5단계가 반복됩니다.

자식 행 캐시 동적 속성은 기본적으로 True로 설정됩니다. 캐싱 동작은 쿼리의 매개 변수 값에 따라 달라집니다. 단일 매개 변수가 있는 쿼리에서는 지정된 매개 변수 값에 대한 자식 레코드 집합은 해당 값을 가진 자식에 대한 요청 간에 캐시됩니다. 다음 코드에서는 이 작업을 보여 줍니다.

SCmd = "SHAPE {select * from customer} " & _  
         "APPEND({select * from orders where cust_id = ?} " & _  
         "RELATE cust_id TO PARAMETER 0) AS chpCustOrder"  
Rst1.Open sCmd, Cnn1  
Set RstChild = Rst1("chpCustOrder").Value  
Rst1.MoveNext      ' Next cust_id passed to Param 0, & new rs fetched   
                   ' into RstChild.  
Rst1.MovePrevious  ' RstChild now holds cached rs, saving round trip.  

둘 이상의 매개 변수가 있는 쿼리에서는 모든 매개 변수 값이 캐시된 값과 일치하는 경우에만 캐시된 자식이 사용됩니다.

매개 변수가 있는 명령 및 복잡한 부모 자식 관계

매개 변수가 있는 명령을 사용하여 동등 조인 유형 계층 구조의 성능을 향상시키는 것 외에도 매개 변수가 있는 명령을 사용하여 더 복잡한 부모-자식 관계를 지원할 수 있습니다. 예를 들어 팀(team_id, team_name)과 게임(date, home_team, visiting_team)으로 구성된 테이블이 두 개 있는 Little League 데이터베이스를 생각해 보세요.

매개 변수가 없는 계층 구조를 사용하면 각 팀의 자식 레코드 집합에 전체 일정을 포함하도록 팀과 게임 테이블을 연결할 수 없습니다. 홈 일정 또는 어웨이 일정을 포함하는 챕터를 만들 수 있지만 둘 다 포함하는 챕터를 만들 수는 없습니다. RELATE 절은 양식의 부모-자식 관계를 (pc1=cc1) AND (pc2=pc2)로 제한하기 때문입니다. 따라서 명령에 "RELATE team_id TO home_team, team_id to visiting_team"가 포함된 경우 팀이 직접 플레이하는 게임만 얻게 됩니다. 원하는 것은 "(team_id=home_team) OR (team_id=visiting_team)"이지만 셰이프 공급자는 OR 절을 지원하지 않습니다.

원하는 결과를 얻으려면 매개 변수가 있는 명령을 사용할 수 있습니다. 예시:

SHAPE {SELECT * FROM teams}   
APPEND ({SELECT * FROM games WHERE home_team = ? OR visiting_team = ?}   
        RELATE team_id TO PARAMETER 0,   
               team_id TO PARAMETER 1)   

다음 예제에서는 SQL WHERE 절의 유연성을 활용하여 필요한 결과를 얻습니다.

참고 항목

WHERE 절을 사용하는 경우 매개 변수는 text, ntext 또는 image에 SQL 데이터 형식을 사용할 수 없거나 다음 설명이 포함된 오류가 발생합니다. Invalid operator for data type.

참고 항목

데이터 셰이핑 예제
공식적인 셰이프 문법
일반적인 셰이프 명령