在彈出來的Add Filter這個頁面,在左邊的欄裡你可以到表中的字段都羅列出來了,雙擊CityId列將它移到右邊的Fileter statement,增加一個條件像CityId=1這樣的,這樣的話就會減小訂閱用戶同步數據的數量,當然這裡的值你必須定義一個常量,因此這個叫做Static Filter(靜態查詢).
在我們的應用中表裡的數據有幾百萬條是一件很正常的事,但有時候設備所需要的數據卻僅僅是這幾百萬條中的幾千條,這個時候靜態過濾就派上它的用場了。我們繼續,先將CityId=1刪除掉因為我們有更重要的條件要應用。
如果你想減小客戶端同步數據的數量,舉個例子,就想我們這裡的應用一樣,每個用戶只需同步他相應城市的數據,我們有字段CityId可以做到這個過濾,但我們不能用靜態過濾,因為那只能過濾到一個城市。其實這個時候我們有個方法那就是用Parameterized Filter(參數查詢).這裡要求使用到 SQL SERVER的HOST_NAME()這個函數來實現這個過濾,只需將Replication對象的屬性設置成HOST_NAME()所對應的值就可以了。你似乎可以寫成下面這樣的條件:
WHERE [CityId]=CONVERT(int,HOST_NAME())
不過很不幸的是,這樣子的結果是無法創建Publication,因為HOST_NAME()的值是無法強制轉換成Integer類型的。不過你可以這樣寫:
CONVERT(nchar,CityId)=HOST_NAME()
其實解決這個問題也不難,你可以執行sp_changemergearticle存儲過程來替換下面的條件
WHERE [CityId]=CONVERT(int,HOST_NAME())
整個的執行過程如下所示:
USE [ParkSurvey]
這樣做的結果是新建一個快照文件夾,但性能會比上面的好。
EXEC sp_changemergearticle
@publication='ParkSurveyPublication',
@article='Cities',
@property='subset_filterclause',
@value='CityId=CONVERT(int,HOST_NAME())',
@force_invalidate_snapshot=1,
@force_reinit_subscription=1;
GO
最後我們來看看Add Filter頁面中底部的單選按鈕,對於每一張建立參數查詢的表來說,你既不能在各個訂閱者的HOSTNAME的值是一樣的時候選擇第一個按鈕,也不能在各個訂閱者的HOSTNAME的值不一樣時選擇第二個按鈕,這很重要因為這樣子會報錯。如果每個訂閱者的HOSTNAME的值是唯一的值的時候你應該選擇第二個按鈕。因此所有的靜態查詢你都必須選擇第一個按鈕讓每一行的數據都發送給每個訂閱者。點擊OK,一個有查詢條件的表就顯示在 Filter Table Rows頁面上了。