0

みなさん、おはようございます!

以下は、私がつなぎ合わせたコードの一部です。CTEリンクテーブルからレコード(データ)を取得し、文字列を日付に変換するよりも、mergeステートメントを使用してデータをローカルテーブルに取得するためにを使用しました。

列(フィールド)に問題があります。LAST_RACE_DATEこのフィールドはNULLに設定されており、必須ではありませんが、現在の設定では更新されません。私が達成しようとしているのは、データが入力されたときにこのフィールドに入力するだけでなく、更新することです。つまり、NULLで更新する必要があります。

したがって、フィールドに特定の日付があり、リモートデータベースに新しい日付が入力された場合、このフィールドも更新されます。バックエンドでデータが削除された場合でも、このフィールドのローカルテーブルデータも削除されます。

WITH CTE AS(

SELECT MEMBER_ID
  ,[MEMBER_DATE] = MAX(CONVERT(DATE, MEMBER_DATE))
  ,RACE_DATE = MAX(CONVERT(DATE, RACE_DATE))
  ,LAST_RACE_DATE = MAX(CONVERT(DATE, LAST_RACE_DATE))

FROM [EXAMPLE].[dbo].[LINKED_MEMBER_DATA]
WHERE (MEMBER_DATE IS NOT NULL) AND (ISDATE(MEMBER_DATE)<> 0) AND (RACE_DATE IS NOT NULL) AND (ISDATE(RACE_DATE)<> 0) 
       AND (LAST_RACE_DATE IS NULL) OR (ISDATE(LAST_RACE_DATE)<> 0) 

GROUP BY MEMBER_ID)

MERGE dbo.LINKED_MEMBER_DATA AS Target
USING (SELECT 
  MEMBER_ID, MEMBER_DATE, RACE_DATE, LAST_RACE_DATE  

FROM CTE 

GROUP BY MEMBER_ID, RACE_DATE, LAST_RACE_DATE)AS SOURCE ON (Target.MEMBER_ID = SOURCE.MEMBER_ID) 

WHEN MATCHED AND 
   (Target.MEMBER_DATE)  <> (SOURCE.MEMBER_DATE)
OR (Target.RACE_DATE) <> (SOURCE.RACE_DATE)
OR ISNULL(TARGET.LAST_RACE_DATE , Target.LAST_RACE_DATE) <> ISNULL(SOURCE.LAST_RACE_DATE, SOURCE.LAST_RACE_DATE)

THEN UPDATE SET

 Target.MEMBER_DATE   =   SOURCE.MEMBER_DATE   
,Target.RACE_DATE  = SOURCE.RACE_DATE 
,Target.LAST_RACE_DATE = SOURCE.LAST_RACE_DATE

WHEN NOT MATCHED BY TARGET THEN
INSERT(
MEMBER_ID, MEMBER_DATE, RACE_DATE, LAST_RACE_DATE)

VALUES (Source.MEMBER_ID, Source.MEMBER_DATE, Source.RACE_DATE, Source.LAST_RACE_DATE);

私もこれを試しました:

ISNULL(Target.LAST_RACE_DATE,'N/A') <> ISNULL(SOURCE.LAST_RACE_DATE,'N/A')

ただし、日付変換に対して以下のエラーが発生します。

文字列から日付や時刻を変換するときに変換に失敗しました。

どうもありがとう!!

4

1 に答える 1

1

ISNULL何もしていないため(値の1つがNULLの場合、式はNULLと評価されます)、NULL値は比較されないため、現在のステートメントは失敗します。ISNULL2つの値のデータ型が同じである必要があるため、2回目の試行は機能しません。たとえば、を試すことができますISNULL(Target.LAST_RACE_DATE, '1970-01-01') <> ISNULL(Source.LAST_RACE_DATE, '1970-01-01')

別のオプションは、さまざまなケースを単純に列挙することです(たとえば、(((Source.LAST_RACE_DATE IS NULL AND Target.LAST_RACE_DATE IS NOT NULL) OR (Source.LAST_RACE_DATE IS NOT NULL AND Target.LAST_RACE_DATE IS NULL) OR (Source.LAST_RACE_DATE <> Target.LAST_RACE_DATE)))。さまざまな状況を列挙すると、コードが少し冗長になりますが、パフォーマンスが向上する可能性があります(処理するデータの量に応じて、測定可能なほど優れているかどうかによって異なります)。 )。

于 2012-05-12T06:47:27.237 に答える