- 浏览: 79407 次
- 性别:
- 来自: dg
文章分类
- 全部博客 (70)
- [随笔分类]DB(数据库) (18)
- c# (1)
- 实用参考代码 (1)
- 默认收藏夹 (9)
- [网站分类]6.读书区(技术书籍阅读心得、书籍推荐) (1)
- xml&web服务 (1)
- [随笔分类]Asp.net (18)
- C# BLOG (1)
- 技术仓库 (0)
- .net (1)
- 编程技巧 (1)
- [随笔分类].Net Framework (1)
- [随笔分类]程序人生(非技术) (1)
- [随笔分类]其他技术类 (1)
- [随笔分类]WAP (1)
- 收藏夹 (1)
- 其他 (1)
- DotNet技术 (4)
- [网站分类]3.非技术区(技术之外的文章,但不要涉及任何政治内容) (4)
- [网站分类]7.提问区(建议在<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>中提问) (2)
- [网站分类]1.首页原创精华.NET区(包含架构设计、设计模式)(对首页文章的要求:原创、高质量、经过认真思考并精心写作) (1)
- [随笔分类]Javascript & Css & Html (1)
最新评论
APPLY 运算符简介:
APPLY 运算符是Sql Server2005新增加的运算符。
使用APPLY运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。
表值函数作为右输入,外部表表达式作为左输入。
通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出。
APPLY运算符生成的列的列表是左输入中的列集,后跟右输入返回的列的列表。
APPLY 运算符的左操作数和右操作数都是表表达式。
这些操作数之间的主要区别是:右操作数可以使用表值函数,从左操作数获取一个列作为函数的参数之一。左操作数可以包括表值函数,但不能以来自右操作数的列作为参数。
演示一下APPLY 运算符的用法:
--建一个表
CREATE TABLE MyData
(
ids INT IDENTITY PRIMARY KEY,
Data NVARCHAR(1000)
)
go
--插入测试数据
INSERT INTO MyData VALUES('')
INSERT INTO MyData VALUES('a,b,c')
INSERT INTO MyData VALUES('q')
INSERT INTO MyData VALUES('i,p')
GO
select * from MyData
go
--查询结果
ids Data
1
2 a,b,c
3 q
4 i,p
CREATE TABLE MyData
(
ids INT IDENTITY PRIMARY KEY,
Data NVARCHAR(1000)
)
go
--插入测试数据
INSERT INTO MyData VALUES('')
INSERT INTO MyData VALUES('a,b,c')
INSERT INTO MyData VALUES('q')
INSERT INTO MyData VALUES('i,p')
GO
select * from MyData
go
--查询结果
ids Data
1
2 a,b,c
3 q
4 i,p
建立一个表,作用是:按逗号分解字符,分解出的每一个字符做一行数据返回
create FUNCTION fun_MyData(
@data AS NVARCHAR(1000)
)
RETURNS @tem TABLE( id INT , value nvarchar(100) )
AS
BEGIN
select @data=isnull(@data,'')
if len(@data)=0
return --字符长度为0 ,退出
declare @id AS INT
select @id=1
declare @end AS INT
select @end = CHARINDEX(',', @data)
while(@end>0)
begin
insert into @tem(id,value)
select @id,left(@data,@end-1)
select @id=@id+1
select @data=right(@data,len(@data)-@end)
select @end = CHARINDEX(',', @data)
end
if len(@data)>0
begin
insert into @tem(id,value)
select @id,@data
end
RETURN
END
@data AS NVARCHAR(1000)
)
RETURNS @tem TABLE( id INT , value nvarchar(100) )
AS
BEGIN
select @data=isnull(@data,'')
if len(@data)=0
return --字符长度为0 ,退出
declare @id AS INT
select @id=1
declare @end AS INT
select @end = CHARINDEX(',', @data)
while(@end>0)
begin
insert into @tem(id,value)
select @id,left(@data,@end-1)
select @id=@id+1
select @data=right(@data,len(@data)-@end)
select @end = CHARINDEX(',', @data)
end
if len(@data)>0
begin
insert into @tem(id,value)
select @id,@data
end
RETURN
END
开始使用APPLY 运算符:
SELECT m.ids, f.*
FROM MyData m CROSS APPLY fun_MyData(data) f
go
--结果
ids id value
2 1 a
2 2 b
2 3 c
3 1 q
4 1 i
4 2 p
SELECT m.ids, f.*
FROM MyData m OUTER APPLY fun_MyData(data) f
go
--结果
ids id value
1 NULL NULL
2 1 a
2 2 b
2 3 c
3 1 q
4 1 i
4 2 p
FROM MyData m CROSS APPLY fun_MyData(data) f
go
--结果
ids id value
2 1 a
2 2 b
2 3 c
3 1 q
4 1 i
4 2 p
SELECT m.ids, f.*
FROM MyData m OUTER APPLY fun_MyData(data) f
go
--结果
ids id value
1 NULL NULL
2 1 a
2 2 b
2 3 c
3 1 q
4 1 i
4 2 p
我们看到OUTER APPLY返回的结果行比CROSS APPLY多。
这一点有点象inner join(内部联接)和Left Outer Join(左外部联接)之间的关系.
其实APPLY有两种形式:CROSS APPLY 和 OUTER APPLY。
CROSS APPLY仅返回外部表中通过表值函数生成结果集的行。
OUTER APPLY既返回生成结果集的行,也返回不生成结果集的行,其中表值函数生成的列中的值为 NULL。
以上是sql2005的解决方案,下面我演示一下sql2000怎么解决这样的查询:
思路是:做个循环来逐个链接查询。
sql2000版本
<!---->--sql2000版本
declare @ids int
select @ids =0
declare @data nvarchar(200)
select @data=''
--定义表变量临时存放数据
declare @tem table(
ids int,
id int,
value nvarchar(100)
)
DECLARE test_cursor CURSOR FOR
SELECT ids, Data FROM MyData
OPEN test_cursor
FETCH NEXT FROM test_cursor
INTO @ids,@data
WHILE @@FETCH_STATUS = 0
begin
insert into @tem
select @ids,id,value
from dbo.fun_MyData(@data)
FETCH NEXT FROM test_cursor
INTO @ids,@data
end
CLOSE test_cursor
DEALLOCATE test_cursor
select * from @tem
<!---->--sql2000版本
declare @ids int
select @ids =0
declare @data nvarchar(200)
select @data=''
--定义表变量临时存放数据
declare @tem table(
ids int,
id int,
value nvarchar(100)
)
DECLARE test_cursor CURSOR FOR
SELECT ids, Data FROM MyData
OPEN test_cursor
FETCH NEXT FROM test_cursor
INTO @ids,@data
WHILE @@FETCH_STATUS = 0
begin
insert into @tem
select @ids,id,value
from dbo.fun_MyData(@data)
FETCH NEXT FROM test_cursor
INTO @ids,@data
end
CLOSE test_cursor
DEALLOCATE test_cursor
select * from @tem
同样得到了结果,但是sql2000要利用循环,这样代码复杂,计算耗时。
让我们充分利用Sql Server2005新兵器:APPLY运算符给我们带来的简便快捷的运算方式吧.
发表评论
-
MS SQL数据库备份和恢复存储过程(加强版本)
2004-05-20 13:55 745上次写了MS SQL数据库备份和恢复存储过程详细情况见(htt ... -
求每组前2名,你有几种方法?(MS SQL2000)
2004-08-23 11:55 874create table abc( i nvarchar(10 ... -
ORDER BY排序后,表中字段相加的困惑?
2005-02-03 16:38 964在sql server2000自带DB-pubs 运行下面的s ... -
sql server中UNION 运算符随笔(几个需要注意的地方小总结)
2005-03-03 11:35 1049UNION 运算符是将两个或更多查询的结果组合为单个结果集 ... -
局部临时表和表变量的重复创建问题随笔
2005-04-22 11:51 886今天遇到一个需求,是根据逻辑判断动态创建局部临时表 ... -
Sql Server2005 Transact-SQL 新兵器学习总结之-TRY…CATCH
2007-12-03 13:56 712Transact-SQL 代码中的错误可使用 TRY…CATC ... -
Sql Server2005 Transact-SQL 新兵器学习总结之-数据类型
2007-12-03 14:57 732sql server2005新增加了2大数据类型: 1.大值数 ... -
Sql Server2005 Transact-SQL 新兵器学习总结之-TOP 运算符
2007-12-03 16:49 711TOP 运算符介绍:TOP 运算符在Sql Serve ... -
Sql Server2005 Transact-SQL 新兵器学习总结之-公用表表达式(CTE)
2008-07-31 14:52 856公用表表达式是Sql Server ... -
Sql Server2005 Transact-SQL 新兵器学习总结之-窗口函数(OVER)
2008-08-26 07:53 9001.简介: SQL Server 2005中的窗口函数帮助你迅 ... -
Sql Server2005 Transact-SQL 新兵器学习总结之-DDL触发器
2008-09-02 07:48 8411.简介:Sql Server2005新增加了DDL触发器。与 ... -
Sql Server2005 Transact-SQL 新兵器学习总结之-总结
2008-09-03 07:49 707Microsoft SQL Server 2005扩展了SQL ... -
sqlserver日期推算(年,季度,月,星期推算)
2008-11-19 19:20 2141DECLARE @dt datetimeSET @dt=GET ... -
sqlserver字符串拆分(split)方法汇总
2008-11-19 20:06 6823--方法0:动态SQL法declare @s varchar( ... -
sqlserver字符串合并(merge)方法汇总
2008-11-19 20:23 3565--方法1--使用游标法进行字符串合并处理的示例。--处理的数 ... -
sqlserver排序规则在拼音处理中的应用
2008-11-21 08:53 1045--1. 按拼音排序DECLARE @t TABLE(co ... -
sqlserver排序规则在全角与半角处理中的应用
2008-11-21 09:41 1176--1.查询区分全角与半角字符--测试数据DECLARE ...
相关推荐
SQL Server 2008 Transact-SQL Recipes SQL Server 2008 Transact-SQL Recipes
《SQL Server 数据库》Transact-SQL程序设计实验报告.pdf《SQL Server 数据库》Transact-SQL程序设计实验报告.pdf《SQL Server 数据库》Transact-SQL程序设计实验报告.pdf《SQL Server 数据库》Transact-SQL程序设计...
Microsoft SQL Server 2008 對Transact-SQL 語言進行了進一步增強!这个是对SQL2008在T_SQL方面增强作了详细的介绍!
仅供学习参考,不喜勿喷,标准SQL和transact-sql之比较学习
Beginning Transact-SQL with SQL Server 2000 and 2005 byPaul TurleyandDan Wood Wrox Press 2006 (594 pages) ISBN:076457955X Prepare for the ever-increasing demands of programming....
SQL Server 2012 Transact-SQL DML Reference
SqlServer实验二:数据查询和Transact-SQL基础.doc SqlServer实验二:数据查询和Transact-SQL基础.doc SqlServer实验二:数据查询和Transact-SQL基础.doc SqlServer实验二:数据查询和Transact-SQL基础.doc Sql...
Writing Queries Using Microsoft SQL Server 2008 Transact-SQL
Beginning Transact-SQL with SQL Server 2000 and 2005 byPaul TurleyandDan Wood Wrox Press 2006 (594 pages) ISBN:076457955X Prepare for the ever-increasing demands of programming. Beginning with an ...
SQL Server 2005 Beta 2 Transact-SQL 增强功能
Transact—SQL是结构化查询语言(SQL)的增强版本,与许多ANSI SQL标准兼容,Transact-SQL代码已成为SQL Server的核心。本书全面介绍了Transact—SQL,全书共21章,按照由浅入深的顺序,详细介绍了Transact-SQL...
Prepare for Microsoft Exam 70-761–and help demonstrate your real-world mastery of SQL Server 2016 Transact-SQL data management, queries, and database programming. Designed for experienced IT ...
Beginning Transact-SQL with SQL Server 2000 and 2005 byPaul TurleyandDan Wood Wrox Press 2006 (594 pages) ISBN:076457955X Prepare for the ever-increasing demands of programming. Beginning with an ...
Transact-SQL参考(SQL Server 2000) 计算机专业电子书。 Transact-SQL参考(SQL Server 2000).chm
Transact-SQL 对使用 Microsoft® SQL Server™ 非常重要。与 SQL Server 通讯的所有应用程序都通过向服务器发送 Transact-SQL 语句来进行通讯,而与应用程序的用户界面无关。 Transact-SQL 由多种应用程序生成,...
SQL2005中Transact-SQL的增强,数据库定义语句增强,数据库操作语句增强,结构化异常处理
Transact-SQL基本函数集 ------------------------------ ----算术函数---- /***三角函数***/ SIN(float_expression)--返回以弧度表示的角的正弦 COS(float_expression)--返回以弧度表示的角的余弦 TAN(float_...
Beginning Transact-SQL with SQL Server 2000 and 2005 byPaul TurleyandDan Wood Wrox Press 2006 (594 pages) ISBN:076457955X Prepare for the ever-increasing demands of programming....
Beginning Transact-SQL with SQL Server 2000 and 2005 byPaul TurleyandDan Wood Wrox Press 2006 (594 pages) ISBN:076457955X Prepare for the ever-increasing demands of programming....
Transact-SQL语言 Transact-SQL语言 Transact-SQL语言