原文:
如何使用OPENQUERY访问另一个SQL Server
在项目中,经常会遇到一个数据库访问另一个数据库,【CNVFERPDB】为服务器名,【CE3】为库名
1 SELECT Dtl. * 2 FROM CNVFERPDB. CE3.ce3.ZTLE0125 Dtl 3 INNER JOIN CNVFERPDB.CE3.ce3.ZTLE0124 Mst 4 ON Dtl.RECVSUPPNO = Mst.RECVSUPPNO AND Dtl.MANDT = Mst.MANDT 5 WHERE Mst.MANDT = ' 100 ' and Dtl.BRANDCODE = ' MD '
上面的方式是通过服务器名和库名直接访问,这样有多次连接另一个服务器,执行速度会很慢
可以换做下面的形式,执行速度将得到提升:
1 SELECT * 2 FROM OPENQUERY (CNVFERPDB 3 , 4 ' 5 SELECT Dtl.* 6 FROM CE3.ce3.ZTLE0125 Dtl 7 INNER JOIN CE3.ce3.ZTLE0124 Mst 8 ON Dtl.RECVSUPPNO = Mst.RECVSUPPNO AND Dtl.MANDT = Mst.MANDT 9 WHERE Mst.MANDT = '' 100 '' and Dtl.BRANDCODE= '' MD '' 10 ' 11 )
OPENQUERY ( linked_server ,'query' )
使用注意事项:
linked_server
表示链接服务器名称的标识符。
' query '
在链接服务器中执行的查询字符串。 该字符串的最大长度为 8 KB。
补充
1 declare @Day VARCHAR ( 10 ) = CONVERT ( CHAR ( 8 ), DATEADD ( DAY , - 1 , GETDATE ()), 112 ) 2 3 -- set @Day='20140605' 4 5 IF EXISTS ( select * from AppLog where Dates = @Day ) 6 return 7 8 declare @sql VARCHAR ( 2000 ) = ' select * 9 INTO #temp 10 from openquery 11 ([CNSASPLOGDB01], 12 '' 13 select 14 A.ProgramId 15 , ''''' + @Day + ''''' AS Dates 16 ,COUNT(Duration) as Count 17 ,SUM(CAST(Duration AS DECIMAL(12,3)))/1000 AS SumTime 18 ,AVG(CAST(Duration AS DECIMAL(12,3)))/1000 as AvgTime 19 ,MAX(CAST(Duration AS DECIMAL(12,3)))/1000 as MaxTime 20 from 21 ( 22 select * from LogCSLK01.dbo.AppLog_ ' + @Day + ' with(nolock) 23 union 24 select * from LogCSLK02.dbo.AppLog_ ' + @Day + ' with(nolock) 25 union 26 select * from LogCSLK03.dbo.AppLog_ ' + @Day + ' with(nolock) 27 ) A 28 group by A.ProgramId 29 '' 30 ) 31 32 insert into AppLog 33 select * 34 from #temp 35 36 drop table #temp 37 ' 38 -- print @sql 39 40 exec ( @sql )