• 相关软件
    >INSERT 创建者:webmaster 更新时间:2006-02-16 15:51

    将新行添加到表或视图。



    语法


    INSERT [ INTO]

        { table_name WITH ( < table_hint_limited > [ ...n ] )

            | view_name

        
        | rowset_function_limited

        }



        {    
    [ ( column_list ) ]

            { VALUES

                ( { DEFAULT | NULL | expression } [ ,...n] )

                
    | derived_table

                
    | execute_statement

            }

        }

        
    | DEFAULT VALUES



    < table_hint_limited > ::=

        
    { FASTFIRSTROW

            
    | HOLDLOCK

            | PAGLOCK

            | READCOMMITTED

            | REPEATABLEREAD

            | ROWLOCK

            | SERIALIZABLE

            | TABLOCK

            | TABLOCKX

            | UPDLOCK

        }



    参数


    [INTO]



    一个可选的关键字,可以将它用在 INSERT 和目标表之间。



    table_name



    将要接收数据的表或 table 变量的名称。



    WITH (<table_hint_limited> [...n])



    指定目标表所允许的一个或多个表提示。需要有 WITH 关键字和圆括号。不允许有 READPAST、NOLOCK 和 READUNCOMMITTED。有关表提示的更多信息,请参见 FROM



    view_name



    视图的名称及可选的别名。通过 view_name 来引用的视图必须是可更新的。由 INSERT 语句所做的修改不能影响视图的 FROM 子句中引用的多个基表。例如,在多表视图中的 INSERT 必须使用 column_listcolumn_list 是只引用来自一个基表的列。有关可更新视图的更多信息,请参见 CREATE VIEW



    rowset_function_limited



    是 OPENQUERY 或 OPENROWSET 函数。有关更多信息,请参见 OPENQUERY 以及 OPENROWSET



    (column_list)



    要在其中插入数据的一列或多列的列表。必须用圆括号将 column_list 括起来,并且用逗号进行分隔。



    如果某列不在 column_list 中,则 Microsoft® SQL Server™ 必须能够基于该列的定义提供一个值;否则不能装载行。如果列满足下面的条件,那么 SQL Server 将自动为列提供值:


    • 具有 IDENTITY 属性。使用下一个增量标识值。



    • 有默认值。使用列的默认值。



    • 具有 timestamp 数据类型。使用当前的时间戳值。



    • 是可空的。使用空值。



    当向标识列中插入显式的值时,必须使用 column_list 及 VALUES 列表,并且对于表,SET IDENTITY_INSERT 选项必须是 ON。



    VALUES



    引入要插入的数据值的列表。对于 column_list(如果已指定)中或者表中的每个列,都必须有一个数据值。必须用圆括号将值列表括起来。



    如果 VALUES 列表中的值与表中列的顺序不相同,或者未包含表中所有列的值,那么必须使用 column_list 明确地指定存储每个传入值的列。



    DEFAULT



    强制 SQL Server 装载为列定义的默认值。如果对于某列并不存在默认值,并且该列允许 NULL,那么就插入 NULL。对于使用 timestamp 数据类型定义的列,插入下一个时间戳值。DEFAULT 对标识列无效。



    expression



    一个常量、变量或表达式。表达式不能包含 SELECT 或 EXECUTE 语句。



    derived_table



    任何有效的 SELECT 语句,它返回将装载到表中的数据行。



    execute_statement



    任何有效的 EXECUTE 语句,它使用 SELECT 或 READTEXT 语句返回数据。



    如果将 execute_statement 与 INSERT 一起使用,那么每个结果集都必须与表中或 column_list 中的列兼容。execute_statement 可以用来执行同一服务器或远程服务器上的存储过程。执行远程服务器中的过程,然后将结果集返回到本地服务器,并装载到本地服务器的表中。如果 execute_statement 使用 READTEXT 语句返回数据,那么每个单独的 READTEXT 语句最多可以返回 1 MB (1024 KB) 的数据,也可以将 execute_statement 与扩展过程一起使用,并且插入扩展过程的主线程返回的数据。不会插入不是主线程的其它线程中的输出结果。



    说明  对于 SQL Server 7.0,execute_statement 不包含返回 textimage 列的扩展存储过程。这个行为是从 SQL Server 早期版本变化而来的。



    DEFAULT VALUES



    强制新行包含为每个列所定义的默认值。



    注释


    INSERT 将新行追加到表中。若要替换表中的数据,必须在使用 INSERT 装载新数据之前,使用 DELETE 或 TRUNCATE TABLE 语句清除现有的数据。若要修改现有行中的列值,请使用 UPDATE。若要创建新表,并且通过一个步骤给它装载数据,请使用 SELECT 语句的 INTO 选项。



    table 变量在其作用域内可以像常规表一样访问。因此,可以像在 INSERT 语句中将行添加到表一样使用 table 变量。有关更多信息,请参见 table



    由 OPENDATASOURCE 函数建立的、作为服务器名部分的四段名称可以作为表源,该表源可以出现在 INSERT 语句中显示表名的所有位置。



    使用 uniqueidentifier 数据类型创建的列存储特殊格式的 16 字节二进制值。与标识列不同,SQL Server 不会为带有 uniqueidentifier 数据类型的列自动地生成值。在插入操作过程中,带有 uniqueidentifier 数据类型的变量以及某些字符串常量可以用于 uniqueidentifier 列(这些字符串常量的形式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,有 36 个字符,其中包括连字符。x 是十六进制数,范围为 0-9 或 a-f。)。例如,对于 uniqueidentifier 变量或列,6F9619FF-8B86-D011-B42D-00C04FC964FF 是一个有效值。使用 NEWID() 函数可以获取全局唯一的 ID (GUID)。



    插入行时,可以应用下列规则:


    • 如果将值装载到带有 charvarcharvarbinary 数据类型的列,尾随空格(对于 charvarchar 是空格,对于 varbinary 是零)的填充和截断是由 SET ANSI_PADDING 设置确定的。该设置是在创建表时为列定义的。有关更多信息,请参见 SET ANSI_PADDING

      下表显示 SET ANSI_PADDING 为 OFF 时的默认操作。























      数据类型默认操作
      Char将带有空格的值填充到已定义的列宽。
      Varchar删除最后的非空格字符后面的尾随空格,而对于只由空格组成的字符串,一直删除到只留下一个空格字符。
      Varbinary删除尾随的零。




    • 如果将一个空字符串 (' ') 装载到带有 varchartext 数据类型的列,那么默认操作是装载一个零长度的字符串。如果数据库的兼容级别小于 70,那么将该值转换成单个空格。有关更多信息,请参见 sp_dbcmptlevel



    • 如果 INSERT 语句违反约束或规则,或者它有与列的数据类型不兼容的值,那么该语句就会失败,并且 SQL Server 显示错误信息。



    • 将空值插入到 textimage 列不能创建有效的文本指针,也不能预分配 8 KB 的文本页。有关插入 text image 数据的更多信息,请参见使用 text、ntext 和 image 函数



    • 如果 INSERT 正在使用 SELECT 或 EXECUTE 装载多行,正在装载的值中出现任何违反规则或约束的行为都会导致整个语句终止,从而不会装载任何行。



    • 当向远程 SQL Server 表中插入值且没有为所有列指定值时,则用户必须标识将向其中插入指定值的列。



    在本地和远程分区视图上,忽略 INSERT 语句的 SET ROWCOUNT 选项的设置。而且,当兼容级别设置为 80 时,在 SQL Server 2000 中的远程表上也不支持 INSERT 语句的 SET ROWCOUNT 选项。



    当为表或视图的 INSERT 操作定义了 INSTEAD-OF 触发器时,该触发器就会执行 INSERT 语句中的 instead of。以前的 SQL Server 版本只支持在 INSERT 中定义的 AFTER 触发器,以及其它数据修改语句。



    如果在表达式赋值过程中 INSERT 语句遇到算术错误(溢出、被零除或域错误),那么 SQL Server 会处理这些错误,就好像 SET ARITHABORT 是 ON 一样。批处理的其余部分将终止,并且会返回一条错误信息。



    权限


    默认情况下,INSERT 权限被授予 sysadmin 固定服务器角色成员,db_ownerdb_datawriter 固定数据库角色成员,以及表的所有者。sysadmindb_owner db_securityadmin 角色成员和表所有者可以将权限转让给其他用户。



    示例


    A. 使用简单的 INSERT


    下面的示例创建表 T1,并且插入一行。



    IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_NAME = 'T1')
      DROP TABLE T1
    GO
    CREATE TABLE T1 ( column_1 int, column_2 varchar(30))
    INSERT T1 VALUES (1, 'Row #1')


    B. 插入与列顺序不同的数据


    下面的示例使用 column_list 及 VALUES 列表显式地指定将被插入每个列的值。



    IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_NAME = 'T1')
      DROP TABLE T1
    GO
    CREATE TABLE T1 ( column_1 int, column_2 varchar(30))
    INSERT T1 (column_2, column_1) VALUES ('Row #1',1)


    C. 插入值少于列个数的数据


    下面的示例创建一个带有四个列的表。INSERT 语句插入一些行,这些行只有部分列包含值。



    IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_NAME = 'T1')
      DROP TABLE T1
    GO
    CREATE TABLE T1
    ( column_1 int identity,
    column_2 varchar(30)
      CONSTRAINT default_name DEFAULT ('column default'),
    column_3 int NULL,
    column_4 varchar(40)
    )
    INSERT INTO T1 (column_4)
      VALUES ('Explicit value')
    INSERT INTO T1 (column_2,column_4)
      VALUES ('Explicit value', 'Explicit value')
    INSERT INTO T1 (column_2,column_3,column_4)
      VALUES ('Explicit value',-44,'Explicit value')
    SELECT *
    FROM T1


    D. 将数据装载到带有标识列的表


    前两个 INSERT 语句允许为新行生成标识值。第三个 INSERT 语句用 SET IDENTITY_INSERT 语句替代列的 IDENTITY 属性,并且将一个显式的值插入到标识列。



    IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_NAME = 'T1')
      DROP TABLE T1
    GO
    CREATE TABLE T1 ( column_1 int IDENTITY, column_2 varchar(30))
    INSERT T1 VALUES ('Row #1')
    INSERT T1 (column_2) VALUES ('Row #2')
    SET IDENTITY_INSERT T1 ON
    INSERT INTO T1 (column_1,column_2)
      VALUES (-99,'Explicit identity value')
    SELECT *
    FROM T1


    E. 通过视图将数据装载到表


    在下面的示例中,INSERT 语句指定一个视图名;但是将新行插入该视图的基础表中。INSERT 语句中 VALUES 列表的顺序必须与视图的列顺序相匹配。



    IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_NAME = 'T1')
      DROP TABLE T1
    GO
    IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS
        WHERE TABLE_NAME = 'V1')
      DROP VIEW V1
    GO
    CREATE TABLE T1 ( column_1 int, column_2 varchar(30))
    GO
    CREATE VIEW V1 AS SELECT column_2, column_1
    FROM T1
    GO
    INSERT INTO V1
      VALUES ('Row 1',1)
    SELECT *
    FROM T1


    F. 使用 DEFAULT VALUES 选项装载数据


    在下面的示例中,CREATE TABLE 语句给每个列定义一个值,当在 INSERT 语句中没有为列指定显式的值时,就可以使用这个值。使用 INSERT 语句的 DEFAULT VALUES 选项,无须提供显式的值就可以添加行。



    IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_NAME = 'T1')
      DROP TABLE T1
    GO
    CREATE DEFAULT bound_default AS 'Bound default value'
    GO
    CREATE TABLE T1
    ( column_1 int identity,
    column_2 varchar(30)
      CONSTRAINT default_name DEFAULT ('column default'),
    column_3 timestamp,
    column_4 varchar(30),
    column_5 int NULL)
    GO
    USE master
    EXEC sp_bindefault 'bound_default','T1.column_4'
    INSERT INTO T1 DEFAULT VALUES
    SELECT *
    FROM T1


    G. 使用 SELECT 和 EXECUTE 选项装载数据


    下面的示例演示三种不同的方法,用来从一个表获取数据,并将数据装载到另一个表。每种方法都基于一个多表 SELECT 语句,该语句在列列表中包含一个表达式及一个文字值。



    第一个 INSERT 语句使用一个 SELECT 语句直接从源表 (authors) 检索数据,并且将结果集存储到 author_sales 表。第二个 INSERT 执行一个包含 SELECT 语句的过程,而第三个 INSERT 将 SELECT 语句作为一个文字字符串执行。



    IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_NAME = 'author_sales')
      DROP TABLE author_sales
    GO
    IF EXISTS(SELECT name FROM sysobjects
        WHERE name = 'get_author_sales' AND type = 'P')
      DROP PROCEDURE get_author_sales
    GO
    USE pubs
    CREATE TABLE author_sales
    ( data_source   varchar(20),
    au_id       varchar(11),
    au_lname     varchar(40),
    sales_dollars smallmoney
    )
    GO
    CREATE PROCEDURE get_author_sales
    AS
      SELECT 'PROCEDURE', authors.au_id, authors.au_lname,
        SUM(titles.price * sales.qty)
      FROM authors INNER JOIN titleauthor
        ON authors.au_id = titleauthor.au_id INNER JOIN titles
        ON titleauthor.title_id = titles.title_id INNER JOIN sales
        ON titles.title_id = sales.title_id
      WHERE authors.au_id like '8%'
      GROUP BY authors.au_id, authors.au_lname
    GO
    --INSERT...SELECT example
    USE pubs
    INSERT author_sales
      SELECT 'SELECT', authors.au_id, authors.au_lname,
        SUM(titles.price * sales.qty)
      FROM authors INNER JOIN titleauthor
        ON authors.au_id = titleauthor.au_id INNER JOIN titles
        ON titleauthor.title_id = titles.title_id INNER JOIN sales
        ON titles.title_id = sales.title_id
      WHERE authors.au_id LIKE '8%'
      GROUP BY authors.au_id, authors.au_lname

    --INSERT...EXECUTE procedure example
    INSERT author_sales EXECUTE get_author_sales

    --INSERT...EXECUTE('string') example
    INSERT author_sales
    EXECUTE
    ('
    SELECT ''EXEC STRING'', authors.au_id, authors.au_lname,
      SUM(titles.price * sales.qty)
      FROM authors INNER JOIN titleauthor
        ON authors.au_id = titleauthor.au_id INNER JOIN titles
        ON titleauthor.title_id = titles.title_id INNER JOIN sales
        ON titles.title_id = sales.title_id
      WHERE authors.au_id like ''8%''
      GROUP BY authors.au_id, authors.au_lname
    ')

    --Show results.
    SELECT * FROM author_sales


    H. 使用 SELECT 语句中的 TOP 子句插入数据


    因为可以在 INSERT 语句中指定 SELECT 语句,所以也可以将 TOP 子句用在 SELECT 语句中。下面的示例将 authors 表中最上面的 10 个作者插入到名为 new_authors 的新表中。



    IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_NAME = 'new_authors')
      DROP TABLE new_authors
    GO
    USE pubs
    CREATE TABLE new_authors
    (
    au_id   id,
    au_lname varchar(40),
    au_fname varchar(20),
    phone   char(12),
    address varchar(40),
    city   varchar(20),  
    state   char(2),
    zip       char(5),
    contract bit
    )
    INSERT INTO new_authors
    SELECT TOP 10 *
    FROM authors
    相关文章
    本页查看次数: