2つのテーブルのある日のデータが一致しているかどうかを判断します(非同期更新)
9544 ワード
需要は以下の通りである:表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つの異なる表に関連します):
本文は“楊金澎”のブログから出て、転載をお断りします!
- -- =============================================
- -- Author:
- -- Create date: 2013.01.06
- -- Description:
- -- =============================================
- CREATE PROC dbo.[Pro_CheckOrder]
- @CheckDate Char(10) ,
- @Flag Bit -- 0 Tbl_Order 1 Tbl_OrderErrorLog
- AS
- BEGIN
- SET NOCOUNT ON
- -- Sql
- Declare @TableName Varchar(50),@MonthTableName Varchar(50),@FieldName Varchar(20),@Sql Varchar(2000),@NextDate Char(10)
-
- Select @TableName='',@MonthTableName='',@FieldName='',@Sql='',@NextDate=Convert(Char(10),DateAdd(d,1,@CheckDate),23)
-
- If @Flag=0 --
- Begin
- Set @TableName='Tbl_Order'
- Set @MonthTableName='Tbl_Order_'+Replace(Left(@CheckDate,7),'-','')
- Set @FieldName='CTUOrderId'
- End
-
- If @Flag=1 --
- Begin
- Set @TableName='Tbl_OrderErrorLog'
- Set @MonthTableName='Tbl_OrderErrorLog_'+Replace(Left(@CheckDate,7),'-','')
- Set @FieldName='ErrorCTUOrderId'
- End
-
- --
- If Exists (Select * From dbo.sysobjects Where id = Object_ID(N'[dbo].[##checkordertemp]') And ObjectProperty(id, N'IsUserTable') = 1)
- Drop Table ##checkordertemp
-
- Declare @Where Varchar(8000)
- 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'')'
- Exec (@Sql)
- -- A.XX <> B.XX Or A.YY <> B.YY Or ...
- Select @Where = IsNull(@Where + ' Or ' , '' ) + 'A.'+ IsNull( Name , '' )
+ ' <> B.' + IsNull( Name , '' ) From ##checkordertemp
Set @Where=SubString(@Where,1,Len(@Where))
-
- Drop Table ##checkordertemp --
-
- Set @Sql='Select * From '+@TableName+' A Join '+@MonthTableName+' B On A.'+@FieldName+'=B.'+@FieldName+' And A.CreateTime Between '''+@CheckDate+''' And '''+@NextDate+''' Where '+@Where
- --Print @Sql
- Exec (@Sql)
- END
- GO
本文は“楊金澎”のブログから出て、転載をお断りします!