2011-08-09 2 views
2

Access 데이터베이스를 다시 쓰는 중이고 재 작성해야 할 MS 액세스 쿼리가 있습니다. 그들은 기본적으로 다음과 같은 설정으로 구성됩니다.다중 행 테이블 함수 또는 저장 프로 시저 사용

SELECT * 
FROM Query1, Query2, Query,... 

이러한 쿼리는 2 개의 기존 데이터베이스에서 사용되며 일반적으로 데이터의 개수/합계로 구성됩니다. 그런 다음 합계를보고에 사용합니다. 대부분의 하위 쿼리는 이와 비슷합니다.

SELECT Count(Account), Reason, Sum(Amount) 
FROM table1 
GROUP BY Reason 

다시 쓰기가 쉽지만 내 문제는 아닙니다. 내 문제는 약 20-30 개의 쿼리를 다시 작성해야한다는 것입니다. 사용자가 현재 가지고있는 요청 중 하나는 계정의 개수와 합계를 구성하는 계정 목록을 가져올 수있는 옵션입니다. 그래서 목록을 원하기 때문에 20-30 개의 쿼리가 두 배로 늘어납니다.

그래서 나는 이것이 그들이

를 원하는 특정 일에 대한 계수 또는 목록을 제공 할 수 있도록 설계하는 최선의 방법을 결정하기 위해 노력하고 나는이 작업을 수행하기 위해 다중 문 테이블 함수를 만드는 생각

하지만, 저장 프로 시저 또는 뷰 또는 다른 것보다 더 좋을지 모르겠다.

나는 어떤 날짜로도 검색 할 수있는 다음 함수를 만들었고 계정 목록이나 카운트를 얻을 수있다.

CREATE FUNCTION [udf_GeBreakdown] 
(
    @BusinessDate  datetime 
    , @ListOfAccounts bit 
) 
RETURNS @TableCount 
TABLE 
(
    Account int, ReasonName varchar(50), Amount money 
) 
AS 
BEGIN 

    DECLARE @PreviousDate smalldatetime 
    SET @PreviousDate = udf_GetNextImportDate(@BusinessDate, -1); 

    IF @ListOfAccounts = 0 
     BEGIN  
      INSERT INTO @TableCount 
      SELECT Count(Account), R.ReasonName, Sum(Amount) 
      FROM Debs.Resolved RS 
      INNER JOIN Debs.Reason R 
       ON RS.ReasonId = R.ReasonId 
      WHERE RS.DebitDate = @PreviousDate 
       AND RS.StatusId NOT IN (15, 17) 
      GROUP BY R.ReasonName 
     END 
    ELSE 
     BEGIN 
      INSERT INTO @TableCount 
      SELECT Account, R.ReasonName, Amount 
      FROM Debs.Resolved RS 
      INNER JOIN Debs.Reason R 
       ON RS.ReasonId = R.ReasonId 
      WHERE RS.DebitDate = @PreviousDate 
       AND RS.StatusId NOT IN (15, 17) 

     END 

    RETURN 
END 

난 그냥 계정 목록을 제공하고 나는이를 쿼리 할 때 내 카운트/합계를 받아야하는 경우 나는이 이런 식으로 일을 시간 낭비인지 모르거나하지 않습니다. 나는 이것을 어떻게 진행하는 것이 가장 좋은지에 대한 도움이나 방향을 찾고있다.

답변

1

성능은이 다중 문 UDF에서 문제가 될 것입니다.

작성한 것 이상으로 시스템을 읽는다면 다음과 비슷한 indexed view을 만들려고합니다.

CREATE VIEW V1 WITH SCHEMABINDING AS 
SELECT RS.DebitDate, Account, R.ReasonName, Amount 
FROM Debs.Resolved RS 
INNER JOIN Debs.Reason R 
    ON RS.ReasonId = R.ReasonId 
WHERE RS.StatusId NOT IN (15, 17) 

CREATE INDEX X on V1 -- based on usage 

그런 다음 SP 또는 단일 명령문 UDF에서 다음 명령문을 사용하여 계정 목록을 가져 오십시오. 이 문장은 그 시점에서 꽤 사소 해집니다. 시스템이 쓰는 경우이 집중적 그러나이 인덱싱 된 뷰의 속도가 느려지고

SELECT Count(Account), ReasonName, Sum(Amount) 
FROM V1 with(noexpand) 
GROUP BY DebitDate, ReasonName -- or use DebitDate in the where clause 

내가 아직 시도 것이다 (당신이보기에 그 기능을 저장하지 않습니다 ... 여기 전날 논리를해야 할 것) 스키마 바인딩 된 테이블에 삽입합니다. 색인 생성보기는 비용이 많이 들기 때문에 정상적인보기 만 만들면 도움이 될 것입니다.