转:OPENDATASOURCE (Transact-SQL)
不使用链接服务器的名称,而提供特殊的连接信息,并将其作为四部分对象名的一部分。
语法
OPENDATASOURCE ( provider_name, init_string )
- provider_name
-
注册为用于访问数据源的 OLE DB 访问接口的 PROGID 的名称。provider_name 的数据类型为 char,无默认值。
- init_string
-
连接字符串,该字符串将要传递给目标提供程序的 IDataInitialize 接口。提供程序字符串语法是以关键字值对为基础的,这些关键字值对由分号隔开,例如:“keyword1=value;keyword2=value”。
若要了解提供程序上支持的特定关键字值对,请参阅 Microsoft Data Access SDK。该文档定义了基本语法。下表列出了 init_string 参数中最常用的关键字。
关键字 OLE DB 属性 有效值和说明 数据源
DBPROP_INIT_DATASOURCE
要连接的数据源的名称。不同的提供程序用不同的方法对此进行解释。对于 SQL Server Native Client OLE DB 访问接口,这指示服务器的名称。对于 Jet OLE DB 访问接口来说,这指示 .mdb 文件或 .xls 文件的完整路径。
位置
DBPROP_INIT_LOCATION
要连接的数据库的位置。
扩展属性
DBPROP_INIT_PROVIDERSTRING
提供程序特定的连接字符串。
连接超时
DBPROP_INIT_TIMEOUT
达到该超时值后,连接尝试将失败。
用户 ID
DBPROP_AUTH_USERID
用于该连接的用户 ID。
密码
DBPROP_AUTH_PASSWORD
用于该连接的密码。
目录
DBPROP_INIT_CATALOG
连接到数据源时的初始或默认的目录名称。
集成安全性
DBPROP_AUTH_INTEGRATED
SSPI,指定 Windows 身份验证
仅当 DisallowAdhocAccess 注册表选项针对指定的提供程序显式设置为 0,并且启用 Ad Hoc Distributed Queries 高级配置选项时,OPENDATASOURCE 才可用于访问 OLE DB 数据源中的远程数据。如果未设置这些选项,则默认行为不允许即席访问。
OPENDATASOURCE 函数可以在能够使用链接服务器名的相同 Transact-SQL 语法位置中使用。因此,可以将 OPENDATASOURCE 用作四部分名称的第一部分,该部分名称引用 SELECT、INSERT、UPDATE 或 DELETE 语句中的表或视图的名称;或者引用 EXECUTE 语句中的远程存储过程。当执行远程存储过程时,OPENDATASOURCE 应该引用 SQL Server 的另一个实例。OPENDATASOURCE 不接受参数变量。
与 OPENROWSET 函数类似,OPENDATASOURCE 应该只引用那些不经常访问的 OLE DB 数据源。对于访问次数较频繁的任何数据源,请为它们定义链接服务器。无论 OPENDATASOURCE 还是 OPENROWSET 都不能提供链接服务器定义的全部功能,例如,安全管理以及查询目录信息的功能。每次调用 OPENDATASOURCE 时,都必须提供所有的连接信息(包括密码)。
![]() |
---|
Windows 身份验证比 SQL Server 身份验证要安全得多。应尽量使用 Windows 身份验证。OPENDATASOURCE 不应该用于连接字符串中的显式密码。 |
每个提供程序的连接要求与创建链接服务器时的参数要求相似。在 sp_addlinkedserver (Transact-SQL) 主题中列出了很多常见提供程序的详细信息。
以下示例将创建与服务器 London
上的 SQL Server 实例 Payroll
的即席连接,并查询 AdventureWorks2008R2.HumanResources.Employee
表。(使用 SQLNCLI 并且 SQL Server 将重定向到 SQL Server Native Client OLE DB 访问接口的最新版本。)
以下示例以 1997 - 2003 格式创建与 Excel 电子表格的即席连接。
SELECT * FROM OPENDATASOURCE
('Microsoft.Jet.OLEDB.4.0','Data Source=D:\00.xls;Extended Properties=EXCEL 5.0')...[Sheet1$]
执行此语句可查看到EXCEL表格中的内容。
若有一个电子表格D:\00.xls,里面有五列,格式如:
代码 名称 单位 价格 备注
000 111 个 1 aa
100 222 件 3 bb
SQL中一个表PEITAO中至少有5个字段要对应,则要把EXCEL中的数据导入到SQL的表PEITAO中,则执行下面语句即可:
insert into PEITAO (PTDM,PTMC,DWMC,BZSJ,BZHU) Select [代码], [名称], [单位], [价格],[备注]
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', 'Data Source=D:\00.xls;Extended Properties=EXCEL 5.0')...[Sheet1$](Data Source就是excel文件的路径;默认的Sheet1要写成[Sheet1$],sheet1为EXCEL的sheet名称,后面必须带$;)
============
利用OpenDataSource打开不同类型的数据表(SQL Server) :
-------------------------------Acess----------------------------------
SELECT *
FROM OpenDataSource('Microsoft.Jet.OLEDB.4.0',
'Data Source="d:\eatsun\test.mdb";
Jet OLEDB:Database Password=dgv;User ID=Admin;Password=;')...info
EXEC master..xp_cmdshell 'bcp gfmis.dbo.sgd out d:\sgd.xls -c -q -S"LUONAN" -U"sa" -P"1314"'
-------------------------------Dbase-----------------------------------
Select '' as PSno, sNo, Cname, Type, 0, Floor, Price1, Price2, price3
,Server From opendatasource('Microsoft.jet.oledb.4.0',
'Data Source="D:\eatsun\pos\sys\";
User ID=Admin;Password=;Extended properties=dbase 5.0')... ComRooms
------------------------把*.txt导入SQL中------------------------
1.
SELECT * into aaa FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', 'Data Source="c:\temp\";User ID=Admin;Password=;Extended properties=Text')...[bb#txt](txt文件的路径为c:\temp\bb.txt,其中bb#txt中的bb为txt文件的名称)
2.
select * into aa from OpenRowset('MSDASQL', 'Driver={Microsoft Text Driver (*.txt; *.csv)};
DefaultDir=d:\eatsun;','select * from aa.txt')
3.
BULK INSERT Area FROM 'd:\test\crm\executable\全国邮编区号.txt'
with (FieldTerminator=',',RowTerminator='\n')
ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\yourtablename;Persist Security Info=False';
ADOConnection1.Connected:=True;
ADOConnection1.Execute('SELECT * into t1 FROM t2 IN [ODBC] [ODBC;Driver=SQL Server;UID=sa;PWD=;Server=(LOCAL);DataBase=x;]');
--------------------excel导入SQL中------------------
select * from opendatasource('Microsoft.jet.oledb.4.0',
'Data Source="D:\book1.xls"; Extended Properties="Excel 5.0;
HDR=Yes;";Persist Security Info=False')...sheet1$