다음을 통해 공유


매개 변수가 있는 명령 작업

특히 부모 Recordset크기와 비교하여 큰 자식 Recordset로 작업할 때, 몇 개의 자식 챕터에만 액세스하면 되는 경우 매개 변수가 있는 명령을 사용하는 것이 더 효율적일 수 있습니다.

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

매개 변수가 있는 명령 전체 부모 Recordset검색하지만 장 열에 액세스할 때 레코드 집합 장만 검색합니다. 검색 전략의 이러한 차이는 상당한 성능 이점을 얻을 수 있습니다.

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

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

부모 테이블과 자식 테이블에는 공통으로 사용되는 열 이름으로 cust_id이 있습니다. 자식 명령에는 RELATE 절이 참조하는 "?" 자리 표시자가 있으며, 이는 "...PARAMETER 0"을 의미합니다.

메모

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

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

  1. 부모 명령이 실행되어 Customers 테이블에서 부모 Recordset을 반환합니다.

  2. 챕터 열이 부모 레코드셋 로 추가됩니다.

  3. 부모 행의 장 열에 액세스할 때 customer.cust_id 값을 매개 변수로 사용하여 자식 명령이 실행됩니다.

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

  5. 검색된 자식 행(즉, 자식 Recordset의 장)에 대한 참조는 부모 Recordset의 현재 행의 장 열에 위치합니다.

  6. 3-5단계는 다른 행의 장 열에 액세스할 때 반복됩니다.

캐시 자식 행 동적 속성은 기본적으로 True 값으로 설정됩니다. 캐싱 동작은 쿼리의 매개 변수 값에 따라 달라집니다. 매개변수가 하나인 쿼리에서, 특정 매개변수 값을 가진 자식에 대한 Recordset은 그 값을 가진 자식을 요청할 때 사이에 캐시됩니다. 다음 코드는 다음을 보여 줍니다.

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)으로 구성된 테이블과 게임(날짜, home_team, visiting_team)의 두 테이블이 있는 Little League 데이터베이스를 고려해 보세요.

매개 변수가 없는 계층 구조를 사용하면 각 팀에 대한 자식 Recordset 전체 일정을 포함하는 방식으로 팀과 게임 테이블을 연결할 수 없습니다. 홈 일정 또는 도로 일정을 포함하는 장을 만들 수 있지만 둘 다 만들 수는 없습니다. 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 절을 사용하는 경우 매개 변수는 텍스트, ntext 및 이미지에 SQL 데이터 형식을 사용할 수 없거나 다음 설명을 포함하는 오류가 발생합니다. Invalid operator for data type.

참고 항목

데이터 셰이핑 예제
형식 도형 문법
일반 셰이프 명령