第二个参数是连接串。对于SQL Server提供者,整个连接串应该被单引号括起来,连接串内的每一组信息用分号分割。在上面的例子中,第一组信息指定了目标服务器SqlSrv1,第二组信息指定了该连接可信任连接。在指定目标Server时,如果实例不是该Server的默认实例,则一定要在连接串中指定实例名。
(注意:SQLNCLI提供者还支持其他参数。) OPENROWSET函数的最后一个参数是实际执行的Select语句。注意SQL语句中使用了完整对象名来访问视图。 这样我们就可以使用OPENROWSET函数了。
函数返回一个结果集(我把它用AS命名为“Employees”),From使用该结果集……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
第二个参数是连接串。对于SQL Server提供者,整个连接串应该被单引号括起来,连接串内的每一组信息用分号分割。在上面的例子中,第一组信息指定了目标服务器SqlSrv1,第二组信息指定了该连接可信任连接。在指定目标Server时,如果实例不是该Server的默认实例,则一定要在连接串中指定实例名。(注意:SQLNCLI提供者还支持其他参数。)
OPENROWSET函数的最后一个参数是实际执行的Select语句。注意SQL语句中使用了完整对象名来访问视图。
这样我们就可以使用OPENROWSET函数了。函数返回一个结果集(我把它用AS命名为“Employees”),From使用该结果集的方式与使用其他普通查询的方式一样。
我们在上面提到,你也可以从SQL Server以外的数据源提取数据。例如:下面的Select语句查询微软Access数据库的Employees表。
SELECT Employees.* FROM OPENROWSET( 'Microsoft.Jet.OLEDB.4.0', 'C:DataEmployees.mdb';'admin';' ', 'SELECT EmployeeID, FirstName, LastName, JobTitle FROM Employees ORDER BY LastName, FirstName' ) AS Employees |
你可能注意到了,这次的provider不同于我们在访问SQL Server时使用的Provider。在本例中,Provider是Microsoft.Jet.OLEDB.4.0(注意:对于Access 2007,有新的Provider可用)。
连接串与前面例子中的写法也不一样。整个连接串从头到尾分成了三部分,每一部分都被单引号单独括起来,各部分之间用分号分割。
第一部分指定了Access数据库文件的路径和文件名,后面紧跟着是用户账号admin(Access数据库内部的管理员账号)。第三部分是一个空字符串,是Access数据库的密码。因为admin账号没有设定密码,所以使用空字符串。如果该账号设置了密码,应该把密码写在第三部分。
整个连接串与后面用来从Access数据库查询数据的Select语句用逗号“,”隔开。(我在Access中使用的Employees表是从SQL Server的vEmployee视图导入的)
这就是从Access数据库查询数据要做的全部事情。你的查询会返回一个结果集,该结果集与访问本地SQL Server数据库时得到的结果集类似。
你也可以使用OPENROWSET函数从多个数据源中查询数据。例如:下面的例子我使用inner join(内连接)从远程SQL Server实例和Access数据库查询数据。
SELECT e1.EmployeeID, e2.FirstName, e2.LastName, e1.JobTitle FROM OPENROWSET( 'SQLNCLI', 'Server=SqlSrv1;Trusted_Connection=yes;', 'SELECT EmployeeID, FirstName, LastName, JobTitle FROM AdventureWorks.HumanResources.vEmployee' ) AS e1 INNER JOIN OPENROWSET( 'Microsoft.Jet.OLEDB.4.0', 'C:DataEmployees.mdb'; 'admin';' ', 'SELECT EmployeeID, FirstName, LastName, JobTitle FROM Employees' ) AS e2 ON e1.EmployeeID = e2.EmployeeID ORDER BY e2.LastName, e2.FirstName |
注意:外层的Select语句从两个表返回数据——从SQL Server返回员工ID和工作头衔,从Access数据库返回姓和名。由于你可以得到可靠的连接查询,尽管你是从本地SQL Server实例连接表中查询的数据,你可以处理这些数据。
现在我们来看看OPENROWSET函数的另一个重要功能——批量导入。为了举例需要,我在AdventureWorks数据库中用下面的脚本创建了表Employees并导入数据。
USE AdventureWorks GO IF OBJECT_ID (N'Employees', N'U') IS NOT NULL DROP TABLE dbo.Employees GO SELECT EmployeeID, FirstName, LastName, JobTitle INTO Employees FROM HumanResources.vEmployee GO ALTER TABLE Employees ADD ResumeFile VARBINARY(MAX) NULL GO |
注意:我没有把ResumeFile列的数据导入,它的数据类型是VARBINARY(MAX)。我会用下面的Update语句把Employee1.docx文件作为二进制数据批量导入到该列。
USE AdventureWorks GO UPDATE Employees SET ResumeFile = ( SELECT * FROM OPENROWSET(BULK 'C:DataEmployee1.docx', SINGLE_BLOB) AS ResumeContent) WHERE EmployeeID = 1 |
可以看到,OPENROWSET函数提供了BULK选项,你可以用它来导入数据。要使用BULK选项,需要指定你想要导入的文件,并指定导入方式。既然我想把文件以二进制形式导入,我在上面的例子中使用了SINGLE_BLOB选项。当然,如果该列支持字符型数据,我也可以用SINGLE_CLOB或者SINGLE_NCLOB选项指定数据存储为字符类型格式。此外,在使用OPENROWSET函数批量导入数据功能时,你也可以使用格式化的文件,不过关于格式化文件的用法超出了本文讨论的范围。
不管你是否使用OPENROWSET函数批量导入数据或者连接OLE DB数据源,你都会发现用它获取数据非常方便。关于这个函数的更多细节,请在SQL Server联机图书查看标题为“OPENROWSET (Transact-SQL)”的文章。在那里你可以看到关于SQLNCLI提供者(或者SQL Server 2008的SQLNCL10提供者)的更多细节。
翻译
相关推荐
-
使用SQL Server的OPENROWSET函数(上)
如果你需要运行一个ad hoc查询从远程OLE DB数据源提取数据该怎么办?怎样批量向SQL Server表导入数据?