----------------------------------------
-- 7761098(湖光)--
----------------------------------------这两个语句是sql中最常用的插入数据的方法,也是日常使用频率最高的语句,这里就根据自己的一些经验简单探讨一下基本语法insert into主要有两种方式1. 直接数值插入,一般会列出表的结构然后紧跟要插入的数据,要插入的数据和表结构要严格对应(除了一些计算列之外)USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
    DROP TABLE dbo.T1;
GO
CREATE TABLE dbo.T1 
(
    column_1 int IDENTITY, 
    column_2 varchar(30) 
        CONSTRAINT default_name DEFAULT ('my column default'),
    column_3 timestamp,
    column_4 varchar(40) NULL
);
GO
INSERT INTO dbo.T1 (column_4) 
    VALUES ('Explicit value');
INSERT INTO dbo.T1 (column_2, column_4) 
    VALUES ('Explicit value', 'Explicit value');
INSERT INTO dbo.T1 (column_2) 
    VALUES ('Explicit value');
INSERT INTO T1 DEFAULT VALUES; 
GO
SELECT column_1, column_2, column_3, column_4
FROM dbo.T1
2. 子查询插入,通过查询语句从相关表中读取数据插入USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T2', 'U') IS NOT NULL
    DROP TABLE dbo.T2;
GO
CREATE TABLE dbo.T2 
(
    column_1 int IDENTITY, 
    column_2 varchar(30) 
        CONSTRAINT default_name DEFAULT ('my column default'),
    column_3 timestamp,
    column_4 varchar(40) NULL
);
GO
INSERT INTO dbo.T2 
SELECT column_1, column_2, column_3, column_4
FROM dbo.T1;
GO
select into主要通过查询语句从相关表中读取数据插入到新创建的表中(新创建的表只保留原始结构,但是没有计算函数,约束…)USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName, e.Title, a.AddressLine1, a.City, sp.Name AS [State/Province], a.PostalCode
INTO dbo.EmployeeAddresses
FROM Person.Contact AS c
JOIN HumanResources.Employee AS e ON e.ContactID = c.ContactID
JOIN HumanResources.EmployeeAddress AS ea ON ea.EmployeeID = e.EmployeeID
JOIN Person.Address AS a on a.AddressID = ea.AddressID
JOIN Person.StateProvince as sp ON sp.StateProvinceID = a.StateProvinceID;
GO
这些只是msdn相关的介绍,应该都熟知的,就不多说了特殊应用1. select into 创建和原始列编码一致的表很多时候数据库,表,和列都有不同的编码,尤其是在一些特殊应用下,例如英文版的win 2003下装繁体中文版的sql server 2005然后附加简体中文创建的数据库文件,这些时候开发以及维护的时候就会遇到编码问题,结果不能正确显示甚至查询结果不是自己想要的(equal to在不同编码下不能正常工作),解决方法最好的当然是统一所有的编码了,但是如果不能做到的话这时候一般的解决方法是在要操作数据库下用select into创建临时表,然后将操作数据都放在这个临时表里面,最后在更新到数据库原始表中虽然步骤上面多了一步,但是可以保证完全可旧数据的编码一致,并且不用硬性转码,这里需要注意的是tempdb这个数据库的编码也不一定和操作数据库的编码一致,所以临时表一定要创建在操作数据库上2. select into 创建备份表或者储存查询结果很多时候如果需要多次查询或者更新后要和原始表做比较的话,就可以很方便的利用select into创建一个备份表或者结果集来存储数据方便进一步的使用及操作USE AdventureWorks;
GO
SELECT ×
INTO Person.Contact_bak
FROM Person.Contact GO
异同比较相同点两者都是数据插入,将操作数据插入到目标表不同点1 .性能a.如果数据库采用完全日志(日志记录方式:bulk-logged recovery),两者性能并没有大的区别b.如果简单日志的话,select into会快过insert into很多,测试数据显示select into是insert into大概10倍。由于select into并没有记录下操作日志在ldf文件,而只是简单记录分页日志,所以操作会快很多,但是相应的,这个时候如果试图通过log explorer等日志分析工具来恢复数据库,是行不通的。2.select into 会创建表,如果目标表已经存在就会报错;insert into需要目标表已经存在,否则也会报错3.在触发器或者存储过程中使用select into容易造成死循环4.insert into 可以使用分区表,而select into不能使用,它所创建的表也在数据库默认文件夹下,尽管原始表可能是分区表并具有分区scheme,但是新创建表并不保留这些数据5.select into不能设定表锁,所以会造成锁表总结涉及到编码问题以及测试用途时,可以使用select into以方便创建表,记录数据,保证编码一致。而在正式开发时候,尽量使用insert into可以保证约束,并尽早发现潜在问题。

解决方案 »

  1.   

    先创建表,然后在插入数据 会不会比 select ...into from ...快一下啊因为直接select into 的时候是不知道表结构的啊 
      

  2.   


    ----------------------------------------
    -- 7761098(湖光)--
    ----------------------------------------这两个语句是sql中最常用的插入数据的方法,也是日常使用频率最高的语句,这里就根据自己的一些经验简单探讨一下基本语法insert into主要有两种方式1. 直接数值插入,一般会列出表的结构然后紧跟要插入的数据,要插入的数据和表结构要严格对应(除了一些计算列之外)USE AdventureWorks;
    GO
    IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
        DROP TABLE dbo.T1;
    GO
    CREATE TABLE dbo.T1 
    (
        column_1 int IDENTITY, 
        column_2 varchar(30) 
            CONSTRAINT default_name DEFAULT ('my column default'),
        column_3 timestamp,
        column_4 varchar(40) NULL
    );
    GO
    INSERT INTO dbo.T1 (column_4) 
        VALUES ('Explicit value');
    INSERT INTO dbo.T1 (column_2, column_4) 
        VALUES ('Explicit value', 'Explicit value');
    INSERT INTO dbo.T1 (column_2) 
        VALUES ('Explicit value');
    INSERT INTO T1 DEFAULT VALUES; 
    GO
    SELECT column_1, column_2, column_3, column_4
    FROM dbo.T1
    2. 子查询插入,通过查询语句从相关表中读取数据插入USE AdventureWorks;
    GO
    IF OBJECT_ID ('dbo.T2', 'U') IS NOT NULL
        DROP TABLE dbo.T2;
    GO
    CREATE TABLE dbo.T2 
    (
        column_1 int IDENTITY, 
        column_2 varchar(30) 
            CONSTRAINT default_name DEFAULT ('my column default'),
        column_3 timestamp,
        column_4 varchar(40) NULL
    );
    GO
    INSERT INTO dbo.T2 
    SELECT column_1, column_2, column_3, column_4
    FROM dbo.T1;
    GO
    select into主要通过查询语句从相关表中读取数据插入到新创建的表中(新创建的表只保留原始结构,但是没有计算函数,约束…)USE AdventureWorks;
    GO
    SELECT c.FirstName, c.LastName, e.Title, a.AddressLine1, a.City, sp.Name AS [State/Province], a.PostalCode
    INTO dbo.EmployeeAddresses
    FROM Person.Contact AS c
    JOIN HumanResources.Employee AS e ON e.ContactID = c.ContactID
    JOIN HumanResources.EmployeeAddress AS ea ON ea.EmployeeID = e.EmployeeID
    JOIN Person.Address AS a on a.AddressID = ea.AddressID
    JOIN Person.StateProvince as sp ON sp.StateProvinceID = a.StateProvinceID;
    GO
    这些只是msdn相关的介绍,应该都熟知的,就不多说了特殊应用1. select into 创建和原始列编码一致的表很多时候数据库,表,和列都有不同的编码,尤其是在一些特殊应用下,例如英文版的win 2003下装繁体中文版的sql server 2005然后附加简体中文创建的数据库文件,这些时候开发以及维护的时候就会遇到编码问题,结果不能正确显示甚至查询结果不是自己想要的(equal to在不同编码下不能正常工作),解决方法最好的当然是统一所有的编码了,但是如果不能做到的话这时候一般的解决方法是在要操作数据库下用select into创建临时表,然后将操作数据都放在这个临时表里面,最后在更新到数据库原始表中虽然步骤上面多了一步,但是可以保证完全可旧数据的编码一致,并且不用硬性转码,这里需要注意的是tempdb这个数据库的编码也不一定和操作数据库的编码一致,所以临时表一定要创建在操作数据库上2. select into 创建备份表或者储存查询结果很多时候如果需要多次查询或者更新后要和原始表做比较的话,就可以很方便的利用select into创建一个备份表或者结果集来存储数据方便进一步的使用及操作USE AdventureWorks;
    GO
    SELECT ×
    INTO Person.Contact_bak
    FROM Person.Contact GO
    异同比较相同点两者都是数据插入,将操作数据插入到目标表不同点1 .性能a.如果数据库采用完全日志(日志记录方式:bulk-logged recovery),两者性能并没有大的区别b.如果简单日志的话,select into会快过insert into很多,测试数据显示select into是insert into大概10倍。由于select into并没有记录下操作日志在ldf文件,而只是简单记录分页日志,所以操作会快很多,但是相应的,这个时候如果试图通过log explorer等日志分析工具来恢复数据库,是行不通的。2.select into 会创建表,如果目标表已经存在就会报错;insert into需要目标表已经存在,否则也会报错3.在触发器或者存储过程中使用select into容易造成死循环4.insert into 可以使用分区表,而select into不能使用,它所创建的表也在数据库默认文件夹下,尽管原始表可能是分区表并具有分区scheme,但是新创建表并不保留这些数据5.select into不能设定表锁,所以会造成锁表总结涉及到编码问题以及测试用途时,可以使用select into以方便创建表,记录数据,保证编码一致。而在正式开发时候,尽量使用insert into可以保证约束,并尽早发现潜在问题。
      

  3.   

    肯定不会的,select into from是疏日志操作,
    而sql中日志操作占操作时间的很大部分
    实际使用中select into是快过insert into很多的
      

  4.   

    排版好麻烦,还是习惯live writer的日志格式
      

  5.   

    学习,以我以前的想法,肯定是select into 速度慢于insert into