技術(shù) 點
- 技術(shù)
- 點
- V幣
- 點
- 積分
- 22850
|
前段時間,需要處理數(shù)據(jù)庫同步。由于之前切換服務(wù)器(額,那個locky……請自行百度 ),然后重裝了系統(tǒng),也不知道是因為權(quán)限問題還是端口的原因,反正后面試了好幾次,發(fā)布訂閱數(shù)據(jù)庫都出錯,于是只能退而求其次,打算用腳本來同步。
思路很簡單,大體是先把原先存在的舊數(shù)據(jù)刪除,再追加新數(shù)據(jù)。通過系統(tǒng)自帶的計劃任務(wù),每天運(yùn)行作業(yè),從而達(dá)到同步的目的。需要解決的幾個技術(shù)點分別是:
1、如何獲取遠(yuǎn)程數(shù)據(jù)庫!溄臃⻊(wù)器。大體是在管理工具/ODBC數(shù)據(jù)源上添加系統(tǒng)DSN,輸入用戶名,密碼,服務(wù)器名稱,數(shù)據(jù)庫名,大體就好了。最后在服務(wù)器屬性
2、要不要使用truncate。——如果存量數(shù)據(jù)較多(例如上千萬條記錄),建議不要使用truncate,而改用delete from where,畢竟插入1000萬條記錄,按SQL Server的性能,沒一個小時大概是搞不定的(Sybase問題不大。而MySQL嘛,大概還要更慢,除非你優(yōu)化得很好。)。
3、考慮到存量數(shù)據(jù)可能會更新,個人不建議使用insert into left join null方式來插入數(shù)據(jù)。
4、如何處理字段!悸肥怯辛耍偛荒芤粋個字段手動敲進(jìn)去吧?select 字段1,字段2……因此,可以考慮使用select distinct name from syscolumns where id =OBJECT_ID(表名稱)來獲取表字段,然后拼接為字符串。拼接的方法有兩種,一個是用游標(biāo),另一個是用遞歸查詢(從嚴(yán)格意義上說,這個其實算不上遞歸查詢,因為沒用CTE的特有表達(dá)式)。游標(biāo)嘛,我試過,所以推薦用后者。
確定這幾個問題之后,就可以寫腳本了:
- create proc A9_Sametime(@tblName varchar(50),@dateFieldName varchar(50),@joinFieldName varchar(50)) AS
- declare @colname varchar(1800),
- @sqlDelOld varchar(8000),
- @sqlIndertNew varchar(8000),
- @startDate date,
- --長日期
- @startDateTime datetime,
- @endDateTime datetime
- set @startDate=GETDATE()
- --獲取前一天數(shù)據(jù)
- set @startDateTime=DATEADD(day,-1,@startDate)
- set @endDateTime=DATEADD(MILLISECOND,-3,convert(datetime,@startdate))
- set @colname=''
- --遞歸查詢,獲取所有字段
- select @colname=@colname+c.name+ ',' from (select distinct name from syscolumns where id =OBJECT_ID(@tblName) ) c
- set @colname=substring(@colname,1,len(@colname)-1)
- --使用臨時表(逗你玩的,渣渣的臨時表)
- /*
- set @sql='select * into #temp'
- +@colname+' from openquery(A9Server,'+'''select '+@colname
- +' from [A9SERVER].[S60623].[dbo].['+@tblName+']'
- +' where '+@dateFieldName+' between '''''
- +convert(varchar(23),@startDateTime,21)
- +''''' and '''''+convert(varchar(23),@endDateTime,21)+''''';'') '
- */
- --使用鏈接服務(wù)器,完成數(shù)據(jù)同步操作
- set @sqlDelOld='delete [A9].[dbo].['+@tblName+'] from'+
- ' openquery(A9Server,'+'''select '+@colname
- +' from [A9SERVER].[S60623].[dbo].['+@tblName+']'
- +' where '+@dateFieldName+' between '''''
- +convert(varchar(23),@startDateTime,21)
- +''''' and '''''+convert(varchar(23),@endDateTime,21)+''''';'') A '
- +' left join [A9].[dbo].['+@tblName+'] b'
- +' on a.'+@joinFieldName+'=b.'+@joinFieldName
- set @sqlIndertNew='insert into [A9].[dbo].['+@tblName+']('+@colname+') select '
- +@colname+' from openquery(A9Server,'+'''select '+@colname
- +' from [A9SERVER].[S60623].[dbo].['+@tblName+']'
- +' where '+@dateFieldName+' between '''''
- +convert(varchar(23),@startDateTime,21)
- +''''' and '''''+convert(varchar(23),@endDateTime,21)+''''';'') '
- begin
- exec(@sqlDelOld)
- exec(@sqlIndertNew)
- end
復(fù)制代碼 5、接下來創(chuàng)建作業(yè),設(shè)置好計劃任務(wù)屬性(不是控制面板的那個哦)就好了;驹O(shè)置如下,并不復(fù)雜,所以這里就不全部貼圖了。
|
本帖子中包含更多資源
您需要 登錄 才可以下載或查看,沒有帳號?注冊
x
評分
-
查看全部評分
|