SQL Server 2008 学习笔记【一】 一次性插入多行数据的问题

来源:互联网 发布:邓紫棋 知乎 编辑:程序博客网 时间:2024/06/06 19:04

也许这是一个非常简单的问题,本没有必要在此赘述,但是就是这样一个小例子却令我产生很多困惑。

很久以前网上就有消息说,T-SQL行构造器(Row Constructors)用来在INSERT语句中一次性插入多行数据。

例如:

http://www.5120w.com/html/data/SQLServer/content8136.html

http://www.onegreen.net/Article/Database/SQLServer/SQLServer8/15115.html

等等很多地址

或是希赛的书籍《SQL Server 2008 数据库系统开发》中第27

都有类似这样的示例:

CREATE TABLE testTable

(

Column1 nvarchar(10),

Column2 nvarchar(10)

)

GO

INSERT INTO testTable VALUES(

('1','1'),

('2','2')

)

Drop table testTable

然后这样的示例在我电脑上的SQL Server 2008中根本不能正常运行。

Incorrect syntax near ','.

如果想要正常运行的话

示例应该是这样的:

create table tableName

(

onecol varchar(20),

twocol varchar(20)

)

go

insert into

tableName(onecol,twocol) values

('1','aaaa'),

('2','bbbb')

select * from tableName

drop table tableName

/*

onecol               twocol

-------------------- --------------------

1                    aaaa

2                    bbbb

*/

 

为什么一个如此简单的插入,在网上竟然有两个版本呢?

这两种写法在我的电脑上只有一种能运行又是为什么呢?

首先我们在看一下下面这个网站的介绍:

http://www.5120w.com/html/data/SQLServer/content8136.html

 

文中曾说:

经过增强后的 INSERT 语句的语法结构如下。

以下为引用的内容:

[WITH<common_table_expression>[,...n]]

INSERT 

  [TOP(expression)[PERCENT]] 

  [INTO] 

  {<object>|rowset_function_limited 

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

  }

{

  [(column_list)] 

  [<OUTPUTClause>]

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

  |derived_table 

  |execute_statement 

  |<dml_table_source>

  |DEFAULTVALUES 

  } 

} 

[;]

<object>::=

{ 

  [server_name.database_name.schema_name. 

   |database_name.[schema_name]. 

   |schema_name. 

  ]

    table_or_view_name

}

<dml_table_source>::=

  SELECT<select_list>

  FROM(<dml_statement_with_output_clause>) 

           [AS]table_alias[(column_alias[,...n])]

    [WHERE<search_condition>]

  [OPTION(<query_hint>[,...n])]

 

然后我们在到微软的官网上去看看:

http://msdn.microsoft.com/zh-cn/library/ms174335.aspx

[ WITH <common_table_expression> [ ,...n ] ]

INSERT

    [ TOP ( expression ) [ PERCENT ] ]

    [ INTO ]

    { <object> | rowset_function_limited

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

    }

{

    [ ( column_list ) ]

    [ <OUTPUT Clause> ]

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

    | derived_table

    | execute_statement

        | <dml_table_source>

    | DEFAULT VALUES

    }

}

[; ]

 

<object> ::=

{

    [ server_name . database_name . schema_name .

      | database_name .[ schema_name ] .

      | schema_name .

    ]

    table_or_view_name

}

 

<dml_table_source> ::=

        SELECT <select_list>

        FROM ( <dml_statement_with_output_clause> )

            [AS] table_alias [ ( column_alias [ ,...n ] ) ]

        [ WHERE <search_condition> ]

            [ OPTION ( <query_hint> [ ,...n ] ) ]

 

我们可以看到红色颜色这行是不一样的。

 

这是为什么呢?

难道有人在网上自己造的T-SQL语法?还是这是两个不同的版本?不明白!

 

我的版本号是:

Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)

 

大家可以自己试试,随便把版本号发一下。

 

如果另外那种是错误的,建议大家不要到处转载一些不正确的言论或是文章。

 

@【叶子】http://blog.csdn.net/maco_wang 原创作品,转贴请注明作者和出处,留此信息。

原创粉丝点击