也许这是一个非常简单的问题,本没有必要在此赘述,但是就是这样一个小例子却令我产生很多困惑。
很久以前网上就有消息说,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 原创作品,转贴请注明作者和出处,留此信息。