2017-09-19 8 views
0

원하는 방식대로 비즈니스 요구 사항을 수행하는 데 어려움을 겪고 있습니다. 나는 다른 방법으로 이것을하기위한 제안에 대해서도 열려있다.TSQL - 함수를 파생 테이블로 사용하는 문제 및 오류

기본적으로 Employee 및 Dependent 주소의 컨텍스트에서 상당한 데이터 입력 오류가 있습니다. 종업원은 123 SW 5th St.과 같을 수 있으며, 부양 가족은 123 S.W. 5th St으로 입력 할 수 있습니다. 주소가 동적인지, 즉 직원과의 관계가 같은지를 동적으로 비교해야합니다.

클라이언트와 나는 공간 분리 문자로 주소를 분할하고 Employee와 Dependent의 처음 세 개의 분할을 비교해야하며 두 개가 일치하면 주소가 동일하다고 결정했습니다. 문자열을 분할하는 코드가 제대로 작동하고 있습니다.

내가했다 접근이 있었다 :

  • 세 개의 문자열로 직원 주소를 분할하는 세 개의 문자열로 종속 주소를 분할하고 변수 테이블
  • 사용하는 기능에 반납하는 함수를 사용하여 테이블 변수로 반환합니다.
  • 이러한 테이블을 파생 테이블로 사용하고 여러 다발의 조인을 의도적으로 함께 결합하십시오.
  • 다 대다 조인에서 반환 된 레코드 수가> = 2 인 경우 주소는 동일합니다. 다음은

코드가 모습입니다 같은 : 나는 점점 오전 오류가 The multi-part identifier "#CoDepBenTable.DEV_EmpAddress" could not be bound.입니다

UPDATE #CoDepBenTable 
SET ContactAddressIsDifferent = CASE WHEN COUNT(*) > 1 
           THEN 'N' 
           ELSE 'Y' 
          END 
FROM (SELECT * 
     FROM dbo.fn_CompareAddresses(#CoDepBenTable.DEV_EmpAddress) 
    )AS D 
    JOIN (SELECT * 
      FROM dbo.fn_CompareAddresses(#CoDepBenTable.ContactAddressLine1) 
     ) AS E 
     ON E.AddressPart = D.AddressPart 

The multi-part identifier "#CoDepBenTable.ContactAddressLine1" could not be bound.

이 기능은 데이터와 동일한 데이터베이스에 dbo 스키마에 생성됩니다 비록 내가 처음에 임시 테이블에 데이터를 넣은 다음 임시 테이블을 업데이트하려고 시도했지만.

이 문제를 해결할 수있는 방법이 있습니까? 나는 왜 내가 여기에 오류를 받는지 알 수 없다.

+1

는'SELECT 당신이 원하는 것을 할 수있는 좋은 가이드, Y 또는 N와 마크 ContactAddressIsDifferent * 생각 D'는 SELECT * 에서 와야합니다. #CoDepBenTable 교차 적용 dbo.fn_CompareAddresses (DEV_EmpAddress) x 여기서 ) AS D' 선택하지 않은 표의 열을 전달할 수 없습니다. 이 함수는 테이블 반환 함수이므로 [apply를 사용해야합니다.] (https://dba.stackexchange.com/questions/86143/how-to-join-a-table-with-a-table-valued-function) – scsimon

+0

아직도 이것을 구현하는 중입니다. 그것을 알아낼 수 없다. 문제는 매개 변수로 함수에서 #CoDepBenTable을 참조한다는 것입니다. –

답변

0

나는 AS) 아래의 코드는 dbo.fn_CompareAddresses (# CoDepBenTable.DEV_EmpAddress) FROM

UPDATE @CoDepBenTable 
SET ContactAddressIsDifferent = 'Y' 

declare @CoDepBenTableTEMP table(ID int) 

INSERT INTO @CoDepBenTableTEMP 
SELECT ID FROM 
(
SELECT * FROM @CoDepBenTable T1 
CROSS APPLY dbo.fn_CompareAddresses(T1.DEV_EmpAddress,',') 
) A 
INNER JOIN 
(
SELECT * FROM @CoDepBenTable T2 
CROSS APPLY dbo.fn_CompareAddresses(T2.ContactAddressLine1,',') 
) B ON A.AddressPart = B.AddressPart 

UPDATE T 
SET ContactAddressIsDifferent = 'N' 
FROM @CoDepBenTable T INNER JOIN @CoDepBenTableTEMP TEMP 
ON T.ID = TEMP.ID