【IT168技术文档】
Microsoft SQL Server 2008 对 T-SQL 语言进行了进一步增强。为了让开发人员尽快了解这些变化,我们针对 2007 年 6 月 CTP 版本的 SQL Server 2008 中的 T-SQL 语言的新增功能进行了分析和尝试。本文描述自 SQL Server 2008 CTP1 以来这些语言增强和变化。
1、T-SQL 行构造器
T-SQL 行构造器(Row Constructors)用来在 INSERT 语句中一次性插入多行数据。例如:
CREATE TABLE #a ( Column1 nvarchar(max), Column2 nvarchar(max) ); GO INSERT INTO #a VALUES ( ('1', '1'), ('2', '2') ); SELECT * FROM #a; GO DROP TABLE #a; GO
经过增强后的 INSERT 语句的语法结构如下。
[ 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 ] ) ]
2. FORCESEEK 提示
FORCESEEK 是一个新的表提示(Table Hints),它用来指定 SQL Server 查询优化程序如何更高效的执行查询。该提示指示优化程序对查询引用的表和视图通过索引检索来作为唯一的查询执行访问路径。也就是强制通过索引检索数据。例如:
USE tempdb; GO DROP TABLE t; GO CREATE TABLE t(i int UNIQUE, j int, vc varchar(100)); CREATE INDEX t_vc ON t(vc); GO DECLARE @p1 int, @p2 int, @p3 int, @p4 int, @p5 int; SELECT * FROM t WHERE i IN (@p1, @p2, @p3, @p4, @p5); GO DECLARE @p1 int, @p2 int, @p3 int, @p4 int, @p5 int; SELECT * FROM t WITH (FORCESEEK) WHERE i IN (@p1, @p2, @p3, @p4, @p5); GO SELECT * FROM t WHERE vc LIKE 'Test%'; GO SELECT * FROM t WITH (FORCESEEK) WHERE vc LIKE 'Test%'; GO DECLARE @vc varchar(100); SELECT * FROM t WHERE vc LIKE @vc; GO DECLARE @vc varchar(100); SELECT * FROM t WITH (FORCESEEK) where vc like @vc; GO
3. GROUPING SETS
新的 T-SQL 对 GROUP BY 子句增加了 GROUPING SETS, ROLLUP 和 CUBE 操作符。还有一个新的函数 GROUPING_ID(),它相比 GROUPING() 函数返回更多分组级别的信息。WITH ROLLUP, WITH CUBE 和 ALL 等非 ISO 标准语法已经不再有效。