您的位置:首页 > 数据库

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

2009-09-15 23:55 531 查看
也许这是一个非常简单的问题,本没有必要在此赘述,但是就是这样一个小例子却令我产生很多困惑。
很久以前网上就有消息说,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 原创作品,转贴请注明作者和出处,留此信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: