加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

一步步教你配置SQL SERVER合并复制(六)配置Publisher(下)

发布时间:2016-09-13 14:29:28 所属栏目:MsSql教程 来源:站长网
导读:在弹出来的Add Filter这个页面,在左边的栏里你可以到表中的字段都罗列出来了,双击CityId列将它移到右边的Fileter statement,增加一个条件像CityId=1这样的,
在弹出来的Add Filter这个页面,在左边的栏里你可以到表中的字段都罗列出来了,双击CityId列将它移到右边的Fileter statement,增加一个条件像CityId=1这样的,这样的话就会减小订阅用户同步数据的数量,当然这里的值你必须定义一个常量,因此这个叫做Static Filter(静态查询).

一步步教你配置SQL SERVER合并复制(六)配置Publisher(下)

在我们的应用中表里的数据有几百万条是一件很正常的事,但有时候设备所需要的数据却仅仅是这几百万条中的几千条,这个时候静态过滤就派上它的用场了。我们继续,先将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页面上了。

一步步教你配置SQL SERVER合并复制(六)配置Publisher(下)

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读