select into from与insert into select区别详解,和OPENQUERY语法

一 . 学习中用到的语句:

IF EXISTS(SELECT * FROM SYS.TABLES WHERE NAME='表名') DROP TABLE 表名
SELECT *
INTO 表名
FROM OPENQUERY([IP], 'SELECT 列名,列名 FROM 表名 WITH(NOLOCK)');

二 . 详解:

select * into 目标表名 from 源表名

insert into 目标表名(fld1, fld2) select fld1, 5 from 源表名

以上两句都是将 源表 的数据插入到 目标表,但两句又有区别的:

第一句(select into from)要求目标表不存在,因为在插入时会自动创建。 
第二句(insert into select from)要求目标表存在,由于目标表已经存在,所以我们除了插入源表的字段外,还可以插入常量,如例中的:5。

 

1:复制表结构及数据到新表

select * into 目的数据库名.dbo.目的表名 from 原表名

select * into my0735home.dbo.infoMianTest from infoMian

2:备份表的一部分列(不写*而写出列的列表)

select 列名1,列名2,列名3 into 目的数据库名.dbo.目的表名 from 原表名

select id,title,mtype,stype,author,tel,nr into infoMianTest2 from infomian

3:备份表的一部分行(加WHERE条件)

select * into 目的数据库名.dbo.目的表名 from 原表名 where id<10

select * into infomiantest2 from infomian where id<10

4:备份表的一部分列(不写*而写出列的列表)和一部分行(加WHERE条件)

select 列名1,列名2,列名3 into 目的数据库名.dbo.目的表名 from 原表名 where  id<10

5:只复制表的结构:如:SELECT * INOT t1 FROM titles WHERE 1=2

6:查询结果来源于多个表:如:

SELECT title_id,title,pub_name INTO t3

FROM titles t INNER JOIN publishers p

ON t.pub_id=p.pub_id

 

7. 只复制表数据:

如果两个表结构一样:

insert into table_name_new select * from table_name_old

如果两个表结构不一样:

insert into table_name_new(column1,column2...) select column1,column2... from table_name_old

pasting

 

三 . OPENQUERY语法:

OPENQUERY ( linked_server ,'query' )

对给定的链接服务器执行指定的传递查询。该服务器是 OLE DB 数据源。OPENQUERY 可以在查询的 FROM 子句中引用,就好象它是一个表名。OPENQUERY 也可以作为 INSERT、UPDATE 或 DELETE 语句的目标表进行引用。但这要取决于 OLE DB 访问接口的功能。尽管查询可能返回多个结果集,但是 OPENQUERY 只返回第一个。

 

参数
linked_server
表示链接服务器名称的标识符。

' query '
在链接服务器中执行的查询字符串。该字符串的最大长度为 8 KB。

备注
OPENQUERY 不接受其参数的变量。

在 SQL Server 2000 和更高版本中,OPENQUERY 不能用于对链接服务器执行扩展存储过程。但是,通过使用四部分名称,可以在链接服务器上执行扩展存储过程。例如:

EXEC SeattleSales.master.dbo.xp_msver

权限
任何用户都可以执行 OPENQUERY。用于连接到远程服务器的权限是从为链接服务器定义的设置中获取的。

示例
A. 执行 SELECT 传递查询
以下示例将使用“用于 Oracle 的 Microsoft 访问接口”针对 Oracle 数据库创建一个名为 OracleSvr 的链接服务器。然后,该示例针对此链接服务器使用 SELECT 传递查询。

注意:

本示例假定已经创建了一个名为 ORCLDB 的 Oracle 数据库别名。

EXEC sp_addlinkedserver 'OracleSvr', 
   'Oracle 7.3', 
   'MSDAORA', 
   'ORCLDB'
GO
SELECT *
FROM OPENQUERY(OracleSvr, 'SELECT name, id FROM joe.titles') 
GO

B. 执行 UPDATE 传递查询
以下示例针对示例 A 中创建的链接服务器使用 UPDATE 传递查询。

UPDATE OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles WHERE id = 101') 
SET name = 'ADifferentName';
注意:OPENQUERY 不接受参数变量,也就是说:DELETE OPENQUERY (linked_server, 'SELECT id FROM msgs 
WHERE id=' + @id); 是不正确的,但可以这样做:DELETE OPENQUERY (linked_server, 'SELECT id FROM 
msgs') WHERE id=@id); 。
C. 执行 INSERT 传递查询
以下示例针对示例 A 中创建的链接服务器使用 INSERT 传递查询。

INSERT OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles')
VALUES ('NewTitle');
D. 执行 DELETE 传递查询
以下示例使用 DELETE 传递查询删除示例 C 中插入的行。

DELETE OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles WHERE name = ''NewTitle''');

原文链接:http://www.cnblogs.com/aji88/archive/2009/11/06/1597263.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值