您的位置:首页 > 数据库

SQL2005之后MS SQL版本 T-SQL 新增语法、函数(二)

2011-06-14 15:19 405 查看
本来想把这些新增的语法按照某一原则有序的说明一下,可由于本人水平有限,只能一个一个逐步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可以引用其自身,从而创建递归 CTE。主要是用来获取分层数据的。递归 CTE与程序中的递归算法很类似,主要都包括两部分:

初始值和递归方法。这里的初始值指的是必须预先定义一个CTE作为起始数据,以后的递归调用都是从这发起的;递归方法就是引用

CTE方法进行操作的过程。

当然,递归 CTE不会无休止的执行下去,当引用CTE不能获取到数据时递归便会停止。

      eg.

with cte as
(
select id,name from test where id=2
select id,cte.name + '>' + test.name from test left join cte on test.parentid=cte.id
)
select * from cte /* 这个语句返回的是 id为2的数据的子节点数据,而且其name都用'>'连接 如:' hacker>lily>sue' */

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则会保留重复项。

EXCEPT : 从左查询中返回右查询没有找到的所有非重复值。

注意:INTERSECT比EXCEPT 的优先级高,当同一条sql语句中二者都存在时,会先执行[b]INTERSECT[/b]

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.' ;

6.外连接的另类用法

以前内连接我们可以使用where来代替,但是外连接就没有这样的语法了.2005新推出的*=和=*让我们做到了这点.

select a.*,b.*
from Products a,Categories b
where a.CategoryID*=b.CategoryID
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: