请问SQL2005新增的with是怎么使用的?其语法是怎样?
如下例子,从;with开头的那一段,我实在理解不到其运作过程,请高人指点迷津.
Use Test
go
--顯示一個月的日歷 Andy 2008-7-8Declare
@date datetime,
@StartDate datetime,
@EndDate datetime,
@FirstIndex intSet @date='20080821' --輸入某一月的某一天Select
@StartDate=Convert(char(6),@date,112)+'01',
@EndDate=DateAdd(Month,1,@StartDate)-1,
@FirstIndex=Datediff(day,-1,@StartDate)%7;With t As
(
Select date=Convert(int,1),row=@FirstIndex/7+1,col=@FirstIndex%7
Union All
Select date=date+1,row=(@FirstIndex+date)/7+1,col=(@FirstIndex+date)%7
From t Where date<=@EndDate-@StartDate
)
Select
[日]=Isnull(Convert(char(2),[0]),''),
[一]=Isnull(Convert(char(2),[1]),''),
[二]=Isnull(Convert(char(2),[2]),''),
[三]=Isnull(Convert(char(2),[3]),''),
[四]=Isnull(Convert(char(2),[4]),''),
[五]=Isnull(Convert(char(2),[5]),''),
[六]=Isnull(Convert(char(2),[6]),'')
From t a
Pivot (Max(date) For col in([0],[1],[2],[3],[4],[5],[6])) p
Order By row
/*结果
日 一 二 三 四 五 六
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
*/
如下例子,从;with开头的那一段,我实在理解不到其运作过程,请高人指点迷津.
Use Test
go
--顯示一個月的日歷 Andy 2008-7-8Declare
@date datetime,
@StartDate datetime,
@EndDate datetime,
@FirstIndex intSet @date='20080821' --輸入某一月的某一天Select
@StartDate=Convert(char(6),@date,112)+'01',
@EndDate=DateAdd(Month,1,@StartDate)-1,
@FirstIndex=Datediff(day,-1,@StartDate)%7;With t As
(
Select date=Convert(int,1),row=@FirstIndex/7+1,col=@FirstIndex%7
Union All
Select date=date+1,row=(@FirstIndex+date)/7+1,col=(@FirstIndex+date)%7
From t Where date<=@EndDate-@StartDate
)
Select
[日]=Isnull(Convert(char(2),[0]),''),
[一]=Isnull(Convert(char(2),[1]),''),
[二]=Isnull(Convert(char(2),[2]),''),
[三]=Isnull(Convert(char(2),[3]),''),
[四]=Isnull(Convert(char(2),[4]),''),
[五]=Isnull(Convert(char(2),[5]),''),
[六]=Isnull(Convert(char(2),[6]),'')
From t a
Pivot (Max(date) For col in([0],[1],[2],[3],[4],[5],[6])) p
Order By row
/*结果
日 一 二 三 四 五 六
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
*/
解决方案 »
- 求条触发器?在线结贴!
- 2000NT ,系统连sql2005问题
- “在此上下文中不能使用带有返回值的 RETURN 语句”,请问这是为什么?谢谢!
- sql 组合查询 排序
- SQL千万级的分页存储过程 好语句
- 大家好,如何修改ASP的数据库
- 存储过程能否返回多个值?
- 那里有英文版的sql server下载?
- 在SQLSERVER 中怎样用一条语句插入多条记录,(在同一字段中插入有一定规律的数字,第一条记录这一字段值为1,第二条记录这一字段值为2,第三条记录这一字段值为3,等等)
- 我用VB+SQL SERVER编程,请问一个连接是不是就对应SQL SERVER的一个线程?如果是要如何获得本线程的id号及连接的计算机名?
- 有没有控件可以实现生成行号的功能?
- SQL 作业问题
你可以把With t 的 t 看作为暂时存在的视图,当执行完该批处理后,这个视图立刻失效
因为它的生命周期仅为一次
(
Select date=Convert(int,1),row=@FirstIndex/7+1,col=@FirstIndex%7
Union All
Select date=date+1,row=(@FirstIndex+date)/7+1,col=(@FirstIndex+date)%7
From t Where date <=@EndDate-@StartDate
)
把这段做为一个表,然后从里面取数据
2005中获取该节点及其所有子节点的方法。(小梁)--> 生成测试数据: @T
DECLARE @T TABLE (BOM_NO INT,PRD_NO INT,NAME VARCHAR(5))
INSERT INTO @T
SELECT 123456,1234561,'测试1' UNION ALL
SELECT 123456,1234562,'测试2' UNION ALL
SELECT 1234561,1234563,'测试3' UNION ALL
SELECT 1234561,1234564,'测试4' UNION ALL
SELECT 123458,1234581,'测试5' UNION ALL
SELECT 123459,1234591,'测试6' UNION ALL
SELECT 123459,1234592,'测试7' UNION ALL
SELECT 1234564,12345641,'测试8'--SQL查询如下:DECLARE @BOM_NO INT
SET @BOM_NO=123456;WITH Liang AS
(
SELECT
BOM_NO,PRD_NO,NAME,PATH=CAST(NAME AS VARCHAR(MAX))
FROM @T
WHERE BOM_NO=@BOM_NO
UNION ALL
SELECT
A.BOM_NO,
A.PRD_NO,
A.NAME,
B.PATH+'->'+A.NAME
FROM @T AS A
JOIN Liang AS B
ON A.BOM_NO=B.PRD_NO
)
SELECT *
FROM Liang/*
BOM_NO PRD_NO NAME PATH
----------- ----------- ----- ---------------------------------------
123456 1234561 测试1 测试1
123456 1234562 测试2 测试2
1234561 1234563 测试3 测试1->测试3
1234561 1234564 测试4 测试1->测试4
1234564 12345641 测试8 测试1->测试4->测试8 (5 行受影响)
*/
/*
标题:SQL SERVER 2005 中合并树子项
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2009-01-07
地点:新疆乌鲁木齐
说明:--数据
id fid
----------- -----------
1 0
2 1
3 2
4 2
5 4--结果
id ids
----------- ---------
1 1,2,3,4,5
2 2,3,4,5
3 3
4 4,5
5 5
*/--sql 语句
create table tb(id int,fid int)
insert into tb values(1,0)
insert into tb values(2,1)
insert into tb values(3,2)
insert into tb values(4,2)
insert into tb values(5,4)
go;with Tree as
(
select id , ids = id from tb
union all
select Tree.id, ids = tb.id
from Tree join tb on tb.fid = Tree.ids
)
select id , ids = STUFF((SELECT ',' + rtrim(ids) FROM Tree t WHERE id = tb.id FOR XML PATH('')) , 1 , 1 , '')
from Tree tb
group by iddrop table tb
里边的递归方法非常好用,只是最近有点小问题,因为对SQL一点不懂
CREATE FUNCTION [f_pid](@id int)
RETURNS TABLE
AS
RETURN(
WITH ptb([id],[level])
AS(
SELECT [pid],1 FROM [tb]
WHERE [id]=@id
AND [pid] <>0
UNION ALL
SELECT A.[pid],B.[level]+1
FROM [tb] A,ptb B
WHERE A.[id]=B.[id]
AND [pid] <>0)
SELECT * FROM ptb
)
GO
--调用(查询所有的父)
SELECT A.*,层次=B.[level]
FROM [tb] A,[f_pid](7)B
WHERE A.[id]=B.[id]
GO
as
(
select id,rank() over(order by id) from a
)select * from tablename
========================================
http://www.dbtuning.cn
主营:中小企业数据库管理、优化、调校服务
========================================
数据介质:
--------------
临时表放tempdb cte通常存在于内存生命周期:
---------
全局临时表就不说了
局部临时表在当前会话当前作用域有效
CTE在当前会话当前作用域有效,且只一次,使用时紧跟定义之后,当然可以一次可以定义多个cte在语句中调用:
---------------
临时表引用方法类似表,cte可以递规引用声明:
---------
临时表以#(##)定义
cte 以with 名1 as [结构定义]( 体1)[,名2 as [结构定义 ]( 体2 )..]
当cte的定义跟在select 语句之后时要加;以截断,否则查询编译器会把with当成select 语句中的with来指定option选项,从而报错。值数据:
-------------
临时表如果放到前端程序代码去看,它是一个值,而cte是个引用。也就是在sqlserver中来说,临时表是个表,而cte更像是个视图。定义了一个指向某表指定条件的行集的cte时,对cte进行删除,也将对表记录进行删除.其它:-----------临时表可以建索引,及其它操作如alter之类,cte不能,它更像是表变量