34,590
社区成员
发帖
与我相关
我的任务
分享
declare @CompanyCode as nvarchar(4)
set @CompanyCode=('A1','A2','A3') --这里只是演示,实际不能这么赋值。
SELECT * FROM
(select 'A1' as [Company Code],* from server1.dbo.appDB01.AP01A100
UNION ALL
select 'A2' as [Company Code],* from server2.dbo.appDB02.AP01A200
UNION ALL
select 'A3' as [Company Code],* from server3.dbo.appDB03.AP01A300) P
WHERE P.[Company Code] in (@CompanyCode)
declare @CompanyCode as nvarchar(4)
set @CompanyCode=('A1','A2','A3') --这里只是演示,实际不能这么赋值。
没看明白这个演示,因为这个赋值的方法,在SQL server中确实演示不通,如果再说具体一点,或许更好一些,就现在这个描述,改造语句如下(至于赋值,您自己想办法),此为建议1:
declare @CompanyCode as nvarchar(4)
set @CompanyCode=('A1','A2','A3') --这里只是演示,实际不能这么赋值。
SELECT * FROM
(select 'A1' as [Company Code],* from server1.dbo.appDB01.AP01A100 where @CompanyCode = 'A1'
UNION ALL
select 'A2' as [Company Code],* from server2.dbo.appDB02.AP01A200 where @CompanyCode = 'A2'
UNION ALL
select 'A3' as [Company Code],* from server3.dbo.appDB03.AP01A300 where @CompanyCode = 'A3') P
WHERE P.[Company Code] in (@CompanyCode)
疑问2:server3.dbo.appDB03.AP01A300 这个貌似不是正确的写法,或许是 server3.appDB03.dbo.AP01A300 ?
建议2:您的代码效率低下不仅仅是您描述的这个原因,个人觉得还有如下原因:第一,使用了select * from …… 建议用几个字段,就写明白具体的几个字段;第二,查询链接服务器时where后面可以写的更具体,比如时间段等条件;第三,如果有group by 运算,建议也放在远程上执行,执行完了再查询,会大大减少数据传输量,提高查询效率;第四,如果使用拼接语句(EXEC sql语名),建议还是跟临时表和表变量配合使用吧,用起来更加灵活和高效。[/quote]
谢谢指正,我是临时手打的代码,因为不想把公司的细节暴露太多,只是提一个样的思路。你的第二个方法不错,我已经朝着这个方向改了。
declare @CompanyCode nvarchar(100)
set @CompanyCode=N'A1,A3' --> 传入参数需是这样的格式.
declare @tsql nvarchar(max)
select @tsql=case when charindex(N'A1',@CompanyCode)>0 then
N'select ''A1'' as [Company Code],* from server1.dbo.appDB01.AP01A100 union all '
else N'' end
+case when charindex(N'A2',@CompanyCode)>0 then
N'select ''A2'' as [Company Code],* from server2.dbo.appDB02.AP01A200 union all '
else N'' end
+case when charindex(N'A3',@CompanyCode)>0 then
N'select ''A3'' as [Company Code],* from server3.dbo.appDB03.AP01A300 union all '
else N'' end
select @tsql=left(@tsql,len(@tsql)-9)
exec(@tsql)
declare @CompanyCode as nvarchar(4)
set @CompanyCode=('A1','A2','A3') --这里只是演示,实际不能这么赋值。
没看明白这个演示,因为这个赋值的方法,在SQL server中确实演示不通,如果再说具体一点,或许更好一些,就现在这个描述,改造语句如下(至于赋值,您自己想办法),此为建议1:
declare @CompanyCode as nvarchar(4)
set @CompanyCode=('A1','A2','A3') --这里只是演示,实际不能这么赋值。
SELECT * FROM
(select 'A1' as [Company Code],* from server1.dbo.appDB01.AP01A100 where @CompanyCode = 'A1'
UNION ALL
select 'A2' as [Company Code],* from server2.dbo.appDB02.AP01A200 where @CompanyCode = 'A2'
UNION ALL
select 'A3' as [Company Code],* from server3.dbo.appDB03.AP01A300 where @CompanyCode = 'A3') P
WHERE P.[Company Code] in (@CompanyCode)
疑问2:server3.dbo.appDB03.AP01A300 这个貌似不是正确的写法,或许是 server3.appDB03.dbo.AP01A300 ?
建议2:您的代码效率低下不仅仅是您描述的这个原因,个人觉得还有如下原因:第一,使用了select * from …… 建议用几个字段,就写明白具体的几个字段;第二,查询链接服务器时where后面可以写的更具体,比如时间段等条件;第三,如果有group by 运算,建议也放在远程上执行,执行完了再查询,会大大减少数据传输量,提高查询效率;第四,如果使用拼接语句(EXEC sql语名),建议还是跟临时表和表变量配合使用吧,用起来更加灵活和高效。
select if(true,1+1,1+2);
只有 mysql才执行,mssql在存储过程中可以使用,但那就要定义存储过程在远程数据库中了,可以我没有DBA权限,只有一个查询功能。