使用SQL Server的OPENROWSET函数
使用SQL Server的OPENROWSET你可能常常会需要运行一个ad hoc查询从远程OLE DB数据源提取数据,或者批量向SQL Server表导入数据。
在这种情况下,你可以在T-SQL(Transact-SQL,微软对SQL 的扩展)中用OPENROWSET函数给数据源传入一个连接串和查询来提取需要你可能常常会需要运行一个ad hoc查询从远程OLE DB数据源提取数据,或者批量向SQL Server表导入数据。
在这种情况下,你可以在T-SQL(Transact-SQL,微软对SQL的扩展)中用OPENROWSET函数给数据源传入一个连接串和查询来提取需要的数据。
你可以使用OPENROWSET函数从任何支持注册OLE DB的数据源获取数据,比如从SQL Server或Access的远程实例中提取数据。
如果你用OPENROWSET从SQL Server实例中获取数据,该实例必须配置为允许ad hoc分布式查询。
要配置远程SQL Server实例支持ad hoc查询,需要使用系统存储过程sp_configure先设置advanced options,再启用Ad Hoc Distributed Queries(ad hoc分布式查询)。
请看下面的T-SQL脚本:EXEC sp_configure 'show advanced options', 1;GORECONFIGURE;GOEXEC sp_configure 'Ad Hoc Distributed Queries', 1GORECONFIGURE;GO要注意的是,在运行完存储过程之后,你必须运行“RECONFIGURE”命令。
一旦你配置好了远程SQL Server实例,你就可以对它使用OPENROWSET函数。
这个函数可以在SELECT语句的FROM从句里使用。
下面的例子显示了该函数的基本语法:OPENROWSET('provider', 'connection string', target)可以看到,这个函数有三个参数:•Provider ——某特定数据源支持的OLE DB提供者的人机友好名称(ProgID)。
Provider 的名字必须用单引号括起来。
•Connection string ——连接串。
它是与具体提供者provider相关的字符串,包括连接到给字符串中指定的数据源所需要的细节信息。
根据provider的不同,连接串信息需要用一对或多对单引号括起来。
•Target ——target参数可以使一个数据库对象或者一个查询。
Object ——数据库对象的名字,比如表或者视图的名称。
对象的完整名字必须提供,它们不需要用单引号括起来。
Query ——query是从远程数据源提取数据的Select语句。
Query必须用单引号括起来。
下面的例子展示了OPENROWSET函数的用法:SELECT Employees.*FROM OPENROWSET('SQLNCLI','Server=SqlSrv1;Trusted_Connection=yes','SELECT EmployeeID, FirstName, LastName, JobTitleFROM AdventureWorks.HumanResources.vEmployeeORDER BY LastName, FirstName') AS Employees注意该Select语句的FROM从句中使用了OPENROWSET函数和3个参数。
第一个参数SQLNCLI是SQL Server OLE DB提供者的名称。
第二个参数是连接串。
对于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:\Data\Employees.mdb';'admin';' ','SELECT EmployeeID, FirstName, LastName, JobTitleFROM EmployeesORDER 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, stName, e1.JobTitleFROM OPENROWSET('SQLNCLI','Server=SqlSrv1;Trusted_Connection=yes;','SELECT EmployeeID, FirstName, LastName, JobTitleFROM AdventureWorks.HumanResources.vEmployee') AS e1INNER JOIN OPENROWSET('Microsoft.Jet.OLEDB.4.0','C:\Data\Employees.mdb'; 'admin';' ','SELECT EmployeeID, FirstName, LastName, JobTitleFROM Employees') AS e2ON e1.EmployeeID = e2.EmployeeIDORDER BY stName, e2.FirstName注意:外层的Select语句从两个表返回数据——从SQL Server返回员工ID和工作头衔,从Access数据库返回姓和名。
由于你可以得到可靠的连接查询,尽管你是从本地SQL Server 实例连接表中查询的数据,你可以处理这些数据。
现在我们来看看OPENROWSET函数的另一个重要功能——批量导入。
为了举例需要,我在AdventureWorks数据库中用下面的脚本创建了表Employees并导入数据。
USE AdventureWorksGOIF OBJECT_ID (N'Employees', N'U') IS NOT NULLDROP TABLE dbo.EmployeesGOSELECT EmployeeID, FirstName, LastName, JobTitleINTO EmployeesFROM HumanResources.vEmployeeGOALTER TABLE EmployeesADD ResumeFile VARBINARY(MAX) NULLGO注意:我没有把ResumeFile列的数据导入,它的数据类型是VARBINARY(MAX)。
我会用下面的Update语句把Employee1.docx文件作为二进制数据批量导入到该列。
USE AdventureWorksGOUPDATE EmployeesSET ResumeFile = (SELECT *FROM OPENROWSET(BULK 'C:\Data\Employee1.docx', SINGLE_BLOB)AS ResumeContent)WHERE EmployeeID = 1可以看到,OPENROWSET函数提供了BULK选项,你可以用它来导入数据。
要使用BULK 选项,需要指定你想要导入的文件,并指定导入方式。
既然我想把文件以二进制形式导入,我在上面的例子中使用了SINGLE_BLOB选项。
当然,如果该列支持字符型数据,我也可以用SINGLE_CLOB或者SINGLE_NCLOB选项指定数据存储为字符类型格式。
此外,在使用OPENROWSET函数批量导入数据功能时,你也可以使用格式化的文件,不过关于格式化文件的用法超出了本文讨论的范围。
SQLServer读取及导入Excel数据
SQLServer读取及导⼊Excel数据⼀、引⾔使⽤SQL Server的OPENROWSET及OPENDATASOURCE函数,可以像查询数据表⼀样来读取Excel数据。
但是,要想让这两个函数能正常运⾏,可不是那么容易,假如没理解或没配置好的话,⼀路的报错会让你怀疑⼈⽣。
⼆、配置2.1、组件安装要想使⽤OPENROWSET及OPENDATASOURCE函数来读取Excel数据,⾸先要在⽬标的SQL Server主机上安装AccessDatabaseEngine组件。
1)换句话说:假如要操作的数据库是在本地的,那我在本地安装AccessDatabaseEngine即可;假如要操作的数据库安装在远程的服务器上,那么需在远程的服务器上安装AccessDatabaseEngine。
2)需要说明的是,读取Excel数据,只需安装AccessDatabaseEngine,并不⼀定要安装Office。
3)依⽬标的SQL Server主机的操作系统位数,来对应安装AccessDatabaseEngine版本。
本处Excel是2013版本(.xlsx),需安装Microsoft Access Database Engine 2010 Redistributable。
2.2、服务配置在⽬标的SQL Server主机上,Win+R调出运⾏,输⼊services.msc调出服务。
将SQL Server (MSSQLSERVER)、SQL Full-text Filter Daemon Launcher (MSSQLSERVER)两个服务的登录⾝份,改为本地系统账户。
2.3、参数配置在⽬标的SQL Server上打开查询分析器,执⾏以下语句:--1、开启导⼊功能(查看参数:exec sp_configure)exec sp_configure 'show advanced options',1reconfigureexec sp_configure 'Ad Hoc Distributed Queries',1reconfigure--2、允许在进程中使⽤ACE.OLEDB.12.0exec master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1--3、允许动态参数exec master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 12.3.1、开启导⼊功能对应的系统界⾯:2.3.2、允许在进程中使⽤ACE.OLEDB.12.0及允许动态参数对应的系统界⾯:三、测试3.1、测试语句在⽬标的SQL Server上打开查询分析器,执⾏以下语句:--1、使⽤查询分析器查询EXCEL--注意1:若连接的是本机的数据库,E:\EDI\年度返利费⽤表.xlsx指的是本机的⽂件路径。
sql server使用OpenRowSet函数查询数据
sql server使用OpenRowSet函数查询数据来源:原创作者:小人物录入时间:2009-10-30内容导读:sql server使用OpenRowSet函数查询数据:OpenRowSet( )函数中包含访问OLE DB数据源中的远程数据所需的全部连接信息。
当访问链接服务器中的表时,这种方法是一种替代方法,并且是一种使用OLE使用OpenRowSet函数查询数据OpenRowSet( )函数中包含访问OLE DB数据源中的远程数据所需的全部连接信息。
当访问链接服务器中的表时,这种方法是一种替代方法,并且是一种使用OLE DB连接并访问远程数据的特殊方法。
该函数可以在查询的FROM子句中,像引用表名那样引用OpenRowSet函数。
语法:OPENROWSET ( 'provider_name', { 'datasource' ; 'user_id' ; 'password' | 'provider_string' }, { [ catalog.] [ schema.] object | 'query' } )参数说明:provider_name:注册为用于访问数据源的OLE DB提供程序的PROGID的名称。
datasource:字符串常量,它对应着某个特定的OLE DB数据源。
datasource是将被传递到提供程序IDBProperties接口以初始化提供程序的DBPROP_INIT_DATASOURCE 属性。
通常,这个字符串包含数据库文件的名称、数据库服务器的名称,或者提供程序能理解的用于查找数据库的名称。
user_id:字符串常量,它是传递到指定OLE DB提供程序的用户名。
password:字符串常量,它是将被传递到OLE DB提供程序的用户密码。
provider_string:提供程序特定的连接字符串,将它作为DBPROP_INIT_PROVIDERSTRING属性传递进来以初始化OLE DB 提供程序。
SQLServer数据导入技巧详解
SQLServer数据导入技巧详解SQL Server是一个著名的关系型数据库管理系统,可用于管理大量的数据。
在SQL Server中,数据的导入是很重要的,不仅要保证数据的完整性和准确性,也可能涉及到大量数据的导入和处理。
为了解决这个问题,本文将向你介绍SQL Server中的数据导入技巧。
数据源首先,需要准备好要导入的数据源。
SQL Server支持多种数据源格式,包括CSV、Excel、Access、文本文件等。
其中,CSV格式是最常用的一种格式。
CSV文件是使用逗号分隔的纯文本文件,可以使用文本编辑器打开和修改。
有些软件还支持用Excel导入CSV文件生成。
在使用CSV格式时,需要注意在字段中间不应该加上逗号。
如果有逗号,可以将该字段用双引号括起来。
Excel文件也是常见的数据源格式,但是使用Excel文件进行数据导入,需要注意文件的格式和内容。
特别是在使用中文进行数据导入时,很容易出现编码问题。
这时候需要将文件另存为UTF-8格式的文件,再进行导入。
Access格式和文本文件也可以用于数据导入,但是需要注意文件的格式和内容,如果格式不对,导入时也可能会出现问题。
使用导入向导在SQL Server中,可以使用导入和导出向导来帮助我们完成数据导入。
使用导入向导时,需要选择数据源类型、连接字符串和导入的目标表等参数。
不同的数据源类型需要选择不同的数据源驱动程序。
然后,可以使用“预览”和“编辑映射”来调整导入的数据,以确保数据的完整性和准确性。
对于大量数据的导入,我们可以使用批量插入方法,将数据以批次的方式插入到数据库中。
这种方式可以提高导入速度,减少系统开销。
同时,还可以使用并行操作来提高数据导入的速度。
导入存储过程除了导入向导之外,我们还可以使用存储过程来完成数据导入。
存储过程是SQL Server中一种特殊的程序单元,可以将复杂的业务逻辑和数据处理操作封装起来,提高系统的安全性和可维护性。
sql openrowset的用法 -回复
sql openrowset的用法-回复SQL Server中的OPENROWSET函数是一个非常有用的工具,可以将外部数据源中的数据以表的形式导入到SQL Server中进行查询和分析。
本文将详细介绍OPENROWSET函数的用法,并通过逐步回答问题的方式来确保读者能够全面了解OPENROWSET的工作原理和使用方法。
第一步:什么是OPENROWSET函数?OPENROWSET函数是一种查询操作函数,用于从外部数据源中检索数据。
它允许我们使用SELECT语句查询非SQL Server数据库,如Excel、Access、Oracle等,并将其返回结果作为一个表。
OPENROWSET的使用可以大大简化从外部数据源中提取数据的过程,同时也提高了SQL Server与其他数据库之间的互操作性。
第二步:OPENROWSET的语法是什么?OPENROWSET函数有几种不同的语法形式,我们将介绍最常用的两种。
1. 基本语法:SELECT * FROM OPENROWSET('数据源','查询语句')数据源参数指定了要查询的外部数据源,可以是一个连接字符串,也可以是一个连接信息的别名。
查询语句参数提供了要执行的SQL查询语句,包括从外部数据源中选择数据的过程。
2. 高级语法:SELECT * FROM OPENROWSET('数据源','查询语句',记录过滤参数,列映射参数)记录过滤参数用于过滤从外部数据源中检索的记录。
例如,可以使用WHERE子句来选择特定的行。
列映射参数用于指定数据源中列的映射关系。
这在外部数据源的列名与目标SQL Server表的列名不完全匹配时非常有用。
第三步:如何配置OPENROWSET以连接到外部数据源?在使用OPENROWSET函数之前,需要确保SQL Server已经正确配置了连接到外部数据源的权限和设置。
以下是一些常见的配置步骤:1. 在SQL Server配置管理器中启用Ad Hoc分布式查询。
针对Sqlserver大数据量插入速度慢或丢失数据的解决方法
针对Sqlserver⼤数据量插⼊速度慢或丢失数据的解决⽅法我的设备上每秒将2000条数据插⼊数据库,2个设备总共4000条,当在程序⾥⾯直接⽤insert语句插⼊时,两个设备同时插⼊⼤概总共能插⼊约2800条左右,数据丢失约1200条左右,测试了很多⽅法,整理出了两种效果⽐较明显的解决办法:⽅法⼀:使⽤Sql Server函数:1.将数据组合成字串,使⽤函数将数据插⼊内存表,后将内存表数据复制到要插⼊的表。
2.组合成的字符换格式:'111|222|333|456,7894,7458|0|1|2014-01-01 12:15:16;1111|2222|3333|456,7894,7458|0|1|2014-01-01 12:15:16',每⾏数据中间⽤“;”隔开,每个字段之间⽤“|”隔开。
3.编写函数:CREATE FUNCTION [dbo].[fun_funcname](@str VARCHAR(max),@splitchar CHAR(1),@splitchar2 CHAR(1))--定义返回表RETURNS @t TABLE(MaxValue float,Phase int,SlopeValue float,Data varchar(600),Alarm int,AlmLev int,GpsTime datetime,UpdateTime datetime) AS/*author:hejun licreate date:2014-06-09*/BEGINDECLARE @substr VARCHAR(max),@substr2 VARCHAR(max)--申明单个接收值declare @MaxValue float,@Phase int,@SlopeValue float,@Data varchar(8000),@Alarm int,@AlmLev int,@GpsTime datetimeSET @substr=@strDECLARE @i INT,@j INT,@ii INT,@jj INT,@ijj1 int,@ijj2 int,@m int,@mm intSET @j=LEN(REPLACE(@str,@splitchar,REPLICATE(@splitchar,2)))-LEN(@str)--获取分割符个数IF @j=0BEGIN--INSERT INTO @t VALUES (@substr,1) --没有分割符则插⼊整个字串set @substr2=@substr;set @ii=0SET @jj=LEN(REPLACE(@substr2,@splitchar2,REPLICATE(@splitchar2,2)))-LEN(@substr2)--获取分割符个数WHILE @ii<=@jjBEGINif(@ii<@jj)beginSET @mm=CHARINDEX(@splitchar2,@substr2)-1 --获取分割符的前⼀位置if(@ii=0)set @MaxValue=cast(LEFT(@substr2,@mm) as float)else if(@ii=1)set @Phase=cast(LEFT(@substr2,@mm) as int)else if(@ii=2)set @SlopeValue=cast(LEFT(@substr2,@mm) as float)else if(@ii=3)set @Data=cast(LEFT(@substr2,@mm) as varchar)else if(@ii=4)set @Alarm=cast(LEFT(@substr2,@mm) as int)else if(@ii=5)set @AlmLev=cast(LEFT(@substr2,@mm) as int)else if(@ii=6)INSERT INTO @t VALUES(@MaxValue,@Phase,@SlopeValue,''+@Data+'',@Alarm,@AlmLev,cast(@substr2 as datetime),GETDATE())SET @substr2=RIGHT(@substr2,LEN(@substr2)-(@mm+1)) --去除已获取的分割串,得到还需要继续分割的字符串endelseBEGIN--当循环到最后⼀个值时将数据插⼊表INSERT INTO @t VALUES(@MaxValue,@Phase,@SlopeValue,''+@Data+'',@Alarm,@AlmLev,cast(@substr2 as datetime),GETDATE())END--ENDSET @ii=@ii+1ENDENDELSEBEGINSET @i=0WHILE @i<=@jBEGINIF(@i<@j)BEGINSET @m=CHARINDEX(@splitchar,@substr)-1 --获取分割符的前⼀位置--INSERT INTO @t VALUES(LEFT(@substr,@m),@i+1)-----⼆次循环开始--1.线获取要⼆次截取的字串set @substr2=(LEFT(@substr,@m));--2.初始化⼆次截取的起始位置set @ii=0--3.获取分隔符个数SET @jj=LEN(REPLACE(@substr2,@splitchar2,REPLICATE(@splitchar2,2)))-LEN(@substr2)--获取分割符个数WHILE @ii<=@jjBEGINif(@ii<@jj)beginSET @mm=CHARINDEX(@splitchar2,@substr2)-1 --获取分割符的前⼀位置if(@ii=0)set @MaxValue=cast(LEFT(@substr2,@mm) as float)else if(@ii=1)set @Phase=cast(LEFT(@substr2,@mm) as int)else if(@ii=2)set @SlopeValue=cast(LEFT(@substr2,@mm) as float)else if(@ii=3)set @Data=cast(LEFT(@substr2,@mm) as varchar)else if(@ii=4)set @Alarm=cast(LEFT(@substr2,@mm) as int)else if(@ii=5)set @AlmLev=cast(LEFT(@substr2,@mm) as int)else if(@ii=6)INSERT INTO @t VALUES(@MaxValue,@Phase,@SlopeValue,''+@Data+'',@Alarm,@AlmLev,cast(@substr2 as datetime),GETDATE())SET @substr2=RIGHT(@substr2,LEN(@substr2)-(@mm+1)) --去除已获取的分割串,得到还需要继续分割的字符串endelseBEGIN--当循环到最后⼀个值时将数据插⼊表INSERT INTO @t VALUES(@MaxValue,@Phase,@SlopeValue,''+@Data+'',@Alarm,@AlmLev,cast(@substr2 as datetime),GETDATE())END--ENDSET @ii=@ii+1END-----⼆次循环结束SET @substr=RIGHT(@substr,LEN(@substr)-(@m+1)) --去除已获取的分割串,得到还需要继续分割的字符串ENDELSEBEGIN--INSERT INTO @t VALUES(@substr,@i+1)--对最后⼀个被分割的串进⾏单独处理-----⼆次循环开始--1.线获取要⼆次截取的字串set @substr2=@substr;--2.初始化⼆次截取的起始位置set @ii=0--3.获取分隔符个数SET @jj=LEN(REPLACE(@substr2,@splitchar2,REPLICATE(@splitchar2,2)))-LEN(@substr2)--获取分割符个数WHILE @ii<=@jjBEGINif(@ii<@jj)beginSET @mm=CHARINDEX(@splitchar2,@substr2)-1 --获取分割符的前⼀位置if(@ii=0)set @MaxValue=cast(LEFT(@substr2,@mm) as float)else if(@ii=1)set @Phase=cast(LEFT(@substr2,@mm) as int)else if(@ii=2)set @SlopeValue=cast(LEFT(@substr2,@mm) as float)else if(@ii=3)set @Data=cast(LEFT(@substr2,@mm) as varchar)else if(@ii=4)set @Alarm=cast(LEFT(@substr2,@mm) as int)else if(@ii=5)set @AlmLev=cast(LEFT(@substr2,@mm) as int)else if(@ii=6)INSERT INTO @t VALUES(@MaxValue,@Phase,@SlopeValue,''+@Data+'',@Alarm,@AlmLev,cast(@substr2 as datetime),GETDATE())SET @substr2=RIGHT(@substr2,LEN(@substr2)-(@mm+1)) --去除已获取的分割串,得到还需要继续分割的字符串endelseBEGIN--当循环到最后⼀个值时将数据插⼊表INSERT INTO @t VALUES(@MaxValue,@Phase,@SlopeValue,''+@Data+'',@Alarm,@AlmLev,cast(@substr2 as datetime),GETDATE())ENDSET @ii=@ii+1END-----⼆次循环结束ENDSET @i=@i+1ENDENDRETURNEND4.调⽤函数语句:insert into [mytable] select * from [dbo].[fun_funcname]('111|222|333|456,7894,7458|0|1|2014-01-01 12:15:16;1111|2222|3333|456,7894,7458|0|1|2014-01-01 12:15:16',';','|');5.结果展⽰:select * from [mytable] ;⽅法⼆:使⽤BULK INSERT⼤数据量插⼊第⼀种操作,使⽤Bulk将⽂件数据插⼊数据库Sql代码创建数据库CREATE DATABASE [db_mgr]GO创建测试表USE db_mgrCREATE TABLE dbo.T_Student(F_ID [int] IDENTITY(1,1) NOT NULL,F_Code varchar(10) ,F_Name varchar(100) ,F_Memo nvarchar(500) ,F_Memo2 ntext ,PRIMARY KEY (F_ID))GO填充测试数据Insert Into T_Student(F_Code, F_Name, F_Memo, F_Memo2) select'code001', 'name001', 'memo001', '备注' union all select'code002', 'name002', 'memo002', '备注' union all select'code003', 'name003', 'memo003', '备注' union all select'code004', 'name004', 'memo004', '备注' union all select'code005', 'name005', 'memo005', '备注' union all select'code006', 'name006', 'memo006', '备注'开启xp_cmdshell存储过程(开启后有安全隐患)EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;EXEC sp_configure 'show advanced options', 0;RECONFIGURE;使⽤bcp导出格式⽂件:EXEC master..xp_cmdshell 'BCP db_mgr.dbo.T_Student format nul -f C:/student_fmt.xml -x -c -T'使⽤bcp导出数据⽂件:EXEC master..xp_cmdshell 'BCP db_mgr.dbo.T_Student out C:/student.data -f C:/student_fmt.xml -T'将表中数据清空truncate table db_mgr.dbo.T_Student使⽤Bulk Insert语句批量导⼊数据⽂件:BULK INSERT db_mgr.dbo.T_StudentFROM 'C:/student.data'WITH(FORMATFILE = 'C:/student_fmt.xml')使⽤OPENROWSET(BULK)的例⼦:T_Student表必须已存在INSERT INTO db_mgr.dbo.T_Student(F_Code, F_Name) SELECT F_Code, F_NameFROM OPENROWSET(BULK N'C:/student.data', FORMATFILE=N'C:/student_fmt.xml') AS new_table_name 使⽤OPENROWSET(BULK)的例⼦:tt表可以不存在SELECT F_Code, F_Name INTO db_mgr.dbo.ttFROM OPENROWSET(BULK N'C:/student.data', FORMATFILE=N'C:/student_fmt.xml') AS new_table_name。
SQLSERVER调用OPENROWSET的方法
SQLSERVER调⽤OPENROWSET的⽅法前⾔:正好这两天在同步⽣产环境的某张表数据到测试环境,之前⽤过⼀些同步数据软件,感觉不太可靠,有时候稍有操作不当,就会出现⽣产环境数据被清空等情况,还要去恢复数据。
如果能恢复还好,不能恢复那么......想想就觉得阔怕,后来想起 SQLSERVER 有OPENROWSET 函数可以通过 T-SQL 访问远程数据库,正好可以使⽤,看得见的SQL ⽐同步数据软件看起来安⼼多了,哈哈.... 不讲废话了⼀、OPENROWSET 简介:包含访问 OLE DB 数据源中的远程数据所需的所有连接信息。
当访问链接服务器中的表时,这种⽅法是⼀种替代⽅法,并且是⼀种使⽤ OLE DB 连接并访问远程数据的⼀次性的临时⽅法。
对于较频繁引⽤ OLE DB 数据源的情况,请改为使⽤链接服务器。
OPENROWSET 函数可以在查询的 FROM ⼦句中引⽤,就好象它是⼀个表名。
依据 OLE DB 提供程序的功能,还可以将 OPENROWSET 函数引⽤为 INSERT、UPDATE 或 DELETE 语句的⽬标表。
尽管查询可能返回多个结果集,但 OPENROWSET 只返回第⼀个结果集。
1. 语法详解OPENROWSET( { 'provider_name' , { 'datasource' ; 'user_id' ; 'password'|'provider_string' }, { [ catalog. ][ schema. ] object|'query'}} )provider_name:字符串,表⽰在注册表中指定的 OLE DB 访问接⼝的友好名称)。
provider_name 没有默认值datasource:对应于特定 OLE DB 数据源的字符串常量。
datasource 是要传递给提供程序的 IDBProperties 接⼝的DBPROP_INIT_DATASOURCE 属性,该属性⽤于初始化提供 程序。
sql server中openquery的用法
SQL Server中的openquery是一个非常有用的功能,它允许用户在一个远程服务器上执行查询。
通过Openquery,用户可以在当前服务器上执行远程服务器上的查询,并将结果返回到本地服务器上。
在实际应用中,openquery经常用于处理跨服务器的数据查询、数据同步等任务。
下文将详细介绍openquery的用法和应用。
二、基本语法在SQL Server中,使用openquery需要以下基本语法:OPENQUERY ( linked_server , 'query' )其中,linked_server是连接到远程服务器的名称或标识符,需要在当前服务器上进行配置。
query是在远程服务器上执行的查询语句。
三、示例下面是一个简单的示例,演示了如何使用openquery执行跨服务器查询:```FROM OPENQUERY(LinkedServerName, 'SELECT * FROM TableName')```在这个示例中,LinkedServerName是远程服务器的名称,TableName是远程服务器上的表名。
通过openquery,可以在当前服务器上查询远程服务器上的数据。
四、注意事项在使用openquery时,需要注意以下事项:1. 需要在当前服务器上配置连接到远程服务器的linked server。
可以通过sp_addlinkedserver存储过程或SQL Server Management Studio等工具进行配置。
2. openquery需要在当前服务器的上下文中执行,因此需要确保当前服务器上可以访问远程服务器。
3. 在编写查询语句时,需要注意避免使用在当前服务器上无法识别的特定于远程服务器的语法或函数。
五、应用场景openquery可以应用在多种场景中,主要包括以下几个方面:1. 跨服务器数据查询:在需要从远程服务器上获取数据的情况下,可以使用openquery执行跨服务器查询。
sqlserver 批量导入写法 -回复
sqlserver 批量导入写法-回复批量导入数据是在SQL Server数据库中常见的操作之一,它允许用户一次性导入大量数据而不需要逐条插入。
本文将指导您一步一步了解如何使用SQL Server批量导入数据,并提供一些常见的写法和技巧。
在SQL Server中,有几种方法可以进行批量导入数据,包括使用BULK INSERT语句、使用SQL Server Integration Services(SSIS)工具、使用OPENROWSET函数等。
下面将详细介绍每种方法的使用步骤和示例。
1. 使用BULK INSERT语句批量导入数据:- BULK INSERT是SQL Server中一个内置的命令,用于将数据从外部文件加载到指定的表中。
- 以下是BULK INSERT语句的一般语法:BULK INSERT 表名FROM '数据文件路径'WITH (选项)- 选项可以设置导入数据的格式、字段分隔符、行分隔符等。
- 以下是一个使用BULK INSERT批量导入数据的实例:BULK INSERT ProductsFROM 'C:\Data\Products.csv'WITH (FORMAT = 'CSV',FIELDTERMINATOR = ',',ROWTERMINATOR = '\n')- 上述示例将从名为'Products.csv'的CSV文件中导入数据到名为'Products'的表中。
2. 使用SQL Server Integration Services(SSIS)工具批量导入数据:- SSIS是SQL Server中的一个ETL(Extract, Transform, Load)工具,它提供了更灵活和可扩展的批量导入数据的方式。
- 使用SSIS可以通过图形化界面设计导入数据的流程,包括数据源的选择、数据转换和目标表的映射等。
使用SQLServer的OPENROWSET函数
使用SQLServer的OPENROWSET函数在SQL Server中,OPENROWSET函数用于在SQL查询中通过处理外部数据源的查询结果集。
该函数可以将外部数据源(如Excel文件、文本文件、XML文件等)的数据加载到查询中,从而可以直接对外部数据源执行SQL查询。
OPENROWSET函数可在SELECT语句中使用,允许并行访问多个外部数据源。
要使用OPENROWSET函数,首先需要启用“Ad Hoc Distributed Queries”设置。
默认情况下,该设置为禁用状态,需要通过以下命令启用:```sp_configure 'show advanced options', 1;RECONFIGURE;sp_configure 'Ad Hoc Distributed Queries', 1;RECONFIGURE;```启用后,可以使用OPENROWSET函数来访问外部数据源。
OPENROWSET函数的语法如下:```OPENROWSET(provider_name, datasrc,format_file, ...parameters...)```- provider_name:指定用于访问外部数据源的OLE DB提供程序的名称。
例如,可以使用`Microsoft.ACE.OLEDB.12.0`提供程序访问Excel文件,使用`SQLNCLI`提供程序访问SQL Server数据库等。
- datasrc:指定外部数据源的位置。
具体格式取决于提供程序,如Excel文件的位置可以是一个文件名或一个带有文件路径的UNC路径。
- format_file:指定一个XML格式文件,用于描述查询结果集的各个列的数据类型。
这个参数是可选的,如果不指定,则默认将所有列的数据类型视为nvarchar(max)。
- parameters:用于指定与连接到外部数据源相关的其他参数。
sql openrowset的用法 -回复
sql openrowset的用法-回复SQL Server中的OPENROWSET函数是一个非常有用的函数,可以用于在SQL查询中访问外部数据源。
它可以让我们轻松地从各种外部数据源中检索数据,比如Excel文件、文本文件等。
在本文中,我们将逐步介绍OPENROWSET函数的用法和一些示例。
在使用OPENROWSET函数之前,首先需要确保配置了适当的权限和设置。
在SQL Server中,默认情况下是禁用外部数据源访问的。
因此,我们需要进行一些配置来启用OPENROWSET函数。
以下是一些步骤,以确保我们正确地配置了OPENROWSET函数。
首先,我们需要确认SQL Server实例已启用Ad Hoc分布式查询。
这可以通过查询以下命令来确认:sqlEXEC sp_configure 'show advanced options', 1; RECONFIGURE;EXEC sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE;接下来,我们需要检查“OLE Automation Procedures”和“OPENROWSET”配置项是否为启用状态。
使用以下命令来检查配置项的状态:sqlEXEC sp_configure 'show advanced options', 1; RECONFIGURE;EXEC sp_configure 'Ole Automation Procedures';EXEC sp_configure 'OPENROWSET';如果配置项的值为0,则表示被禁用。
我们需要使用以下命令来启用它们:sqlEXEC sp_configure 'show advanced options', 1; RECONFIGURE;EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;EXEC sp_configure 'OPENROWSET', 1;RECONFIGURE;这些设置与具体的SQL Server版本和配置有关,因此在进行这些更改之前,请确保仔细阅读相关文档,并在测试环境中进行测试。
