2017-09-19 12 views
0

私が欲しいやり方でビジネス要件を満たすことが困難です。私は、これとは別のやり方をするための提案もしています。TSQL - ファンクションを派生テーブルとして使用する問題とエラー

基本的に、EmployeeアドレスとDependentアドレスのコンテキストにはかなりのデータ入力エラーがあります。従業員の名前は123 SW 5th St.のようになります。扶養家族は123 S.W. 5th Stと入力できます。私は住所を動的に比較して、それらが同じかどうか、つまり従業員との扶養の有無を確認する必要があります。

クライアントと私は、スペース区切り文字でアドレスを分割し、EmployeeとDependentの最初の3つの分割を比較し、2つが一致すればアドレスが同じであると判断しました。文字列を分割するコードが正しく動作しています。

私が取ったアプローチは、このでした:表中の

  • 3つの文字列に依存アドレスを分割し、それらを返すように関数を使用して、変数
  • は、3つの文字列の中に従業員の住所を分割する機能を使用し、それらをテーブル変数に戻す
  • これらのテーブルを派生テーブルとして使用し、多対多の結合を意図的に結合します。
  • その多数から多数の結合から返されるレコードの数が> = 2の場合、アドレスは同じです。以下は

コードは次のようになります。私は取得していますエラーがThe multi-part identifier "#CoDepBenTable.DEV_EmpAddress" could not be bound.あり、そしてThe multi-part identifier "#CoDepBenTable.ContactAddressLine1" could not be bound.

関数は、データと同じデータベースにdboスキーマに作成され

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 

私は最初に一時テーブルにデータを入れてから、一時テーブルを更新しようとしていますが、そこから来ています。

これを回避する方法はありますか?なぜ私がここでエラーを受けているのか分かりません。

+1

'* dbo.fn_CompareAddresses(#CoDepBenTable.DEV_EmpAddress) FROM を選択)AS SELECT * FROM #CoDepBenTable dbo.fn_CompareAddresses(DEV_EmpAddress)xを適用するx <ある条件> )AS D'あなたが選択していないテーブルから列を渡すことはできません。これはテーブル値の関数なので、[applyを使う必要があります(https://dba.stackexchange.com/questions/86143/how-to-join-a-table-with-a-table-valued-function ) – scsimon

+0

まだこの実装に取り​​組んでいます。それは分かりません。この問題は、関数内の#CoDepBenTableをパラメータとして参照しているということですが、 –

答えて

0
私は以下のコードは、あなたが欲しいものを行うには良いガイドと思い

マークContactAddressIsDifferent YまたはN

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 
関連する問題