2つのテーブルのある日のデータが一致しているかどうかを判断します(非同期更新)


需要は以下の通りである:表Aは絶えず更新する表であり、表Bは1ヶ月ごとにバックアップする表であり、2つの表の表構造は完全に一致している.表Aのデータは表Bにバックアップした後に更新する可能性があるため、更新した記録を見つけて表Bのデータを同期することができる.実際には、表Aをトリガとして表Bを同期更新したり、表Aを更新しながら表Bを同期更新したりすることができるが、問題はすでに発生している.解决方法しか考えられない:Select*From表A Join表B On表A.Id=表B.Id Where A.XX<>B.XX Or A.YY<>B.YY Or...新しく1つの方法を学びます:EXCEPTを使って、SQL文は以下の通りSELECT*FROM表A EXCEPT SELECT*FROM表BこのSQLは表Aの中であることを返しますしかし表Bの中でないデータの記録EXCEPTをIntersectに変えるならば2つの表の同じ値を返してそれから具体的な需要によってコードを書きます私のコードは以下の通りです(2つの異なる表に関連します):

  
  
  
  
  1. -- =============================================  
  2. -- Author:  
  3. -- Create date: 2013.01.06  
  4. -- Description:  
  5. -- =============================================  
  6. CREATE PROC dbo.[Pro_CheckOrder]  
  7. @CheckDate Char(10) ,  
  8. @Flag Bit           --   0 Tbl_Order   1 Tbl_OrderErrorLog  
  9. AS   
  10. BEGIN 
  11.     SET NOCOUNT ON 
  12.     --              Sql  
  13.     Declare @TableName Varchar(50),@MonthTableName Varchar(50),@FieldName Varchar(20),@Sql Varchar(2000),@NextDate Char(10)  
  14.  
  15.     Select @TableName='',@MonthTableName='',@FieldName='',@Sql='',@NextDate=Convert(Char(10),DateAdd(d,1,@CheckDate),23)  
  16.  
  17.     If @Flag=0    --  
  18.     Begin 
  19.         Set @TableName='Tbl_Order' 
  20.         Set @MonthTableName='Tbl_Order_'+Replace(Left(@CheckDate,7),'-','')  
  21.         Set @FieldName='CTUOrderId' 
  22.     End 
  23.  
  24.     If @Flag=1  --  
  25.     Begin 
  26.         Set @TableName='Tbl_OrderErrorLog' 
  27.         Set @MonthTableName='Tbl_OrderErrorLog_'+Replace(Left(@CheckDate,7),'-','')  
  28.         Set @FieldName='ErrorCTUOrderId' 
  29.     End 
  30.       
  31.     --  
  32.     If Exists (Select * From dbo.sysobjects Where id = Object_ID(N'[dbo].[##checkordertemp]'And ObjectProperty(id, N'IsUserTable') = 1)     
  33.         Drop Table ##checkordertemp  
  34.  
  35.     Declare @Where Varchar(8000)  
  36.     Set @Sql='Select A.name into ##checkordertemp From Syscolumns A Inner Join Sysobjects B On A.id=B.id And B.type=''U'' And B.name='''+@TableName+''' And A.name Not In(''Id'',''CreateTime'')' 
  37.     Exec (@Sql)  
  38.     --   A.XX <> B.XX Or A.YY <> B.YY Or ...  
  39.     Select @Where = IsNull(@Where + ' Or ' , '' ) + 'A.'IsNullName , '' ) 
    ' <> B.' + IsNullName , '' ) From ##checkordertemp    
        Set @Where=SubString(@Where,1,Len(@Where))  
  40.  
  41.     Drop Table ##checkordertemp  --  
  42.  
  43.     Set @Sql='Select * From  '+@TableName+' A Join '+@MonthTableName+' B On A.'+@FieldName+'=B.'+@FieldName+' And A.CreateTime Between '''+@CheckDate+''' And '''+@NextDate+''' Where '+@Where 
  44. --Print @Sql  
  45.     Exec (@Sql)  
  46. END 
  47. GO  

 
本文は“楊金澎”のブログから出て、転載をお断りします!