请问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                  
*/

解决方案 »

  1.   

    建议,看看CTE,搜一下或者找本书了解下
    你可以把With t 的 t 看作为暂时存在的视图,当执行完该批处理后,这个视图立刻失效
    因为它的生命周期仅为一次
      

  2.   

    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 

    把这段做为一个表,然后从里面取数据
      

  3.   

    参考:
    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 行受影响)
    */
      

  4.   

    参考:
    /*
    标题: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
      

  5.   

    参考:--使用SQL Server 2005中的CTE处理树形数据 
    里边的递归方法非常好用,只是最近有点小问题,因为对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  
      

  6.   

    with tablename(id,orde)
    as
    (
    select id,rank() over(order by id) from a
    )select * from tablename
    ========================================
    http://www.dbtuning.cn
    主营:中小企业数据库管理、优化、调校服务
    ========================================
      

  7.   

    个人对cte和临时表的理解
    数据介质:
    --------------
    临时表放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不能,它更像是表变量