SQL2005之后MS SQL版本 T-SQL 新增语法、函数(二)
时间:2011-06-14 来源:Fulltalent Chen
本来想把这些新增的语法按照某一原则有序的说明一下,可由于本人水平有限,只能一个一个逐步F10了,只要能把我自认为比较实用的列出来就行了啊,呵呵
1. 用varchar(max),nvarchar(max),varbinary(max)数据类型代替text ntext image 数据类型
2. 公用表表达式(CTE),可以认为是在单个 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集。
语法:with tablename(columns(可选)) as (query T-SQL) select/update... tablename
eg. with t as
(
select * from test
)
select * from t
注意:
1)公用表表达式 (CTE) 后边必须直接跟实用CTE的语句,否则CTE将会失效。
2)CTE定义时的查询语句如果要使用 order by 语句,前面要跟 top
eg. select top(select count(1) from test) * from test order by weight desc
3) 联机文档中说的“CTE 可在同一查询中引用多次”,其意思是在CTE后面跟的sql语句中可以引用多次,但在这个语句后CTE便会里面失效。
eg. with t as
(
select * from test
)
select * from t inner join t t1 on t.name=t1.name /* 合法语句 */
select * from t /* t已经失效 */
4)当然CTE还有其他的用途如创建递归查询等,先暂时不讨论。
3. update语句
1)update top(N)
eg. update top(2) test set weight=55 但这种形式无法将test排序之后再进行update,所以在这种情况下我们可以借助公用表表达式 (CTE)
如下:
with t as
(
select top(select count(1) from test) * from test order by weight desc
)
update top(2) t set weight=55 /* 如此我们便可以通过order by来达成所要的效果 */
2)update output 返回受update语句影响的数据信息,可以进行日志记录(暂时还没发现其他用途)。
eg.
declare @table table (oldname nvarchar(50),newname nvarchar(50))
update top(2) test set name='output'
output DELETED.name,
INSERTED.name
into @table
select * from @table
结果:oldname newname
hacker output
jack output
3)update .write 用来更新varchar(max) nvarchar(max) 和varbinary(max)类型的数据。
.write('数据',0,null) 全部覆盖更新 (现在看来,这条完全可以 update set colum=value)
.write('数据',n,1)插入式更新 在第n个字符后插入数据.
.write('数据',n,m) 局部覆盖 插入式更新 在第n个字符后,从第n+1字符 至 第m个字符被覆盖更新
4. INTERSECT 返回数据集的交集,这个与union正好相反。
INTERSECT会除去数据集中的重复项,INTERSECT ALL则会保留重复项。
5. SOME、ANY关键字,联机文档上的例子如下:
CREATE PROCEDURE ManyDaysToComplete @OrderID int, @NumberOfDays int
AS
IF
@NumberOfDays < SOME
(
SELECT DaysToManufacture
FROM Sales.SalesOrderDetail
JOIN Production.Product
ON Sales.SalesOrderDetail.ProductID = Production.Product.ProductID
WHERE SalesOrderID = @OrderID
)
PRINT 'At least one item for this order cannot be manufactured in specified number of days.'
ELSE
PRINT 'All items for this order can be manufactured in the specified number of days or less.' ;