目前我做了一个简单的方案来实现,希望能有更好的解决方式。
1.指定一个数据库服务器作为主数据服务器,用于FR创建数据集
2.主数据服务器上创建表存储所有用户的用户名、公司,以及各自公司对应的数据库服务器信息,包括IP,数据库用户名,密码和对应的数据库名
3.在主数据服务器上按各客户的数据库信息创建链接服务器linkserver
4.在主服务器上创建存储过程,存储过程按FR传入的用户参数查找该用户所属公司,以及链接服务器信息和数据库名,在存储过程中用动态拼接SQL的方式来从各自公司的数据库中获取数据
- --exec p_rep_pos_salemaster 'shinger@faya','','2018-04-01','2018-04-01'
- create PROC p_rep_pos_salemaster
- @userName NVARCHAR(200), --传入的用户名参数
- @shoplist VARCHAR(max), --店铺列表
- @begindate VARCHAR(10), --开始日期
- @enddate VARCHAR(10) AS --截止日期
复制代码
--如果传入的用户没有记录,直接返回空结果集
- IF NOT EXISTS(SELECT 1 FROM fr_user WHERE fruserid=@username)
- BEGIN
- SELECT '' AS shopid,NULL billdate,NULL aount
- return
- end
- ELSE
- begin
复制代码
--根据传入的用户参数找到该用户的公司id
- SELECT @companyid=companyid FROM fr_user WHERE fruserid=@username
复制代码
--根据公司id找到对应的链接服务器
- SELECT @serveralias=serveralias,@ipadress=ipadress,@serveruser=serveruser,@serverpsd=serverpsd,@databasename=databasename
- FROM fr_companyserver
- WHERE companyid=@companyid
复制代码
--判断链接服务器是否存在,没有则创建
- IF not exists(select 1 from master.dbo.sysservers where srvname=@serveralias)
- begin
- EXEC sp_addlinkedserver @serveralias,'','SQLOLEDB',@ipadress
- EXEC sp_addlinkedsrvlogin @serveralias,'false',NULL,@serveruser,@serverpsd
- end
复制代码
--定义拼接SQL用于输出门店列表
- DECLARE @sql NVARCHAR(MAX)
- SET @sql=N'select shopid,cast(billdate as date) billdate,sum(payamount) amount
- from @serveralias.@databasename.dbo.sd_pos_salemaster where companyid=''faya'' '+CASE WHEN ISNULL(@shoplist,'')='' THEN '' ELSE ' and shopid in ('''+@shoplist+''')' END+
- ' and billdate>='''+@begindate+''' and billdate<'''+@enddate+'''
- group by shopid,cast(billdate as date)
- union all
- select shopid,cast(billdate as date) billdate,sum(payamount) amount
- from @serveralias.@databasename.dbo.sd_pos_salemaster2 where companyid=''faya'' '+CASE WHEN ISNULL(@shoplist,'')='' THEN '' ELSE ' and shopid in ('''+@shoplist+''')' END+
- ' and billdate>='''+@begindate+''' and billdate<'''+@enddate+'''
- group by shopid,cast(billdate as date)'
- SET @sql=REPLACE( REPLACE(@sql,'@serveralias',@serveralias),'@databasename',@databasename)
- PRINT @sql
复制代码
--执行动态拼接脚本输出结果
- EXEC sp_executesql @sql
- END
- SET NOCOUNT OFF
复制代码
|