数据库之间通过链接服务器访问另一台服务有两种方法,一种是我们常用的使用四部分名称,另外一种就是用行集函数代入参数法。
四部分名称法就是用 “链接服务器.数据库名.用户名.表名”的形式,这个如何加参数我们就不介绍了。
行集函数指的是:OPENQUERY、OPENROWSET、OPENXML、OPENDATASOURCE等,我们通过看语法就知道这类函数不能带入变量。行集函数是直接将写好的语句在服务器上执行,然后再把返回结果显示出来,因此它的效率要比四部分名称法要快,如果说在传语句中再加上条件,那这个差别就更快了,这个在远程服务器非Server SQL 更明显。我们这边做了一个测试,本地是SQL 2008,远程服务器是Oracle 9i,在一个近200W行的表中,显示id=10000的一行记录,用四部分名称平均用时超过54秒,用OPENQUERY不到1S就完成。
1 传递基本值
在基本的 TRANSACT-SQL 语句已知,但必须在一个或多个特定的值传递时使用类似于下面的示例代码
DECLARE @TSQL varchar(8000), @VAR char(2)
SELECT @VAR = 'CA'
SELECT @TSQL = 'SELECT * FROM OPENQUERY(MyLinkedServer,''SELECT * FROM pubs.dbo.authors WHERE state = ''''' + @VAR + ''''''')'
EXEC (@TSQL)
2 传递整个查询
您必须传递整个 TRANSACT-SQL 查询或链接的服务器 (或两者),名称中使用的代码类似于下面的示例:
DECLARE @OPENQUERY nvarchar(4000), @TSQL nvarchar(4000), @LinkedServer nvarchar(4000)
SET @LinkedServer = 'MyLinkedServer'
SET @OPENQUERY = 'SELECT * FROM OPENQUERY('+ @LinkedServer + ','''
SET @TSQL = 'SELECT au_lname, au_id FROM pubs..authors'')'
EXEC (@OPENQUERY+@TSQL)
例子截选自:http://support.microsoft.com/kb/314520/zh-cn