set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [dbo].[ds_GetHisData]
@OrgId nvarchar(30),
@FromTime DateTime,
@EndTime DateTime
AS
BEGIN
SET NOCOUNT ON;
Declare @jlyid nvarchar(20) ;
Declare @sqlStr nvarchar(2000);
Declare @tablenames nvarchar(1024);
--通过递归取得所有的组织编号
WITH userorgs(op_upkey,op_name,op_key,op_rank,orglevel)
AS
(
SELECT op_upkey,op_name,op_key,op_rank ,0 AS orglevel FROM organize_info
WHERE op_key = @OrgId
UNION ALL
SELECT l.op_upkey,l.op_name,l.op_key,l.op_rank,orglevel+1 FROM organize_info l 
INNER JOIN userorgs p ON l.op_upkey=p.op_key
)
--with as 后面必须跟着使用表达式的语句,我想把userorgs用在游标cur_JLYList里
select * from userorgs

--在这个游标里用userorgs无效?????
DECLARE cur_JLYList CURSOR FAST_FORWARD FOR
select G_JLYID
from JLY_Info
where g_opkey in (SELECT op_key FROM userorgs); OPEN cur_JLYList; FETCH NEXT FROM cur_JLYList INTO @JLYId
---日期分表处理
set @tablenames='( HisData'+@JLYId+'.dbo.his'+Datepart(yyyy,@FromTime)+Datepart(mm,@FromTime)
while Datepart(yyyy,@FromTime)!=Datepart(yyyy,@EndTime) or Datepart(mm,@FromTime)!=Datepart(mm,@EndTime)
begin
set @FromTime=Dateadd(m,1,@FromTime)
set @tablenames=@tablenames+' union HisData'+@JLYId+'.dbo.his'+Datepart(yyyy,@FromTime)+Datepart(mm,@FromTime)
end
set @tablenames=@tablenames+') as hisdata'+@jlyid

set @sqlStr = ' select * from '+@tablenames
WHILE @@FETCH_STATUS = 0 --返回被 FETCH  语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。
begin
--开始循环游标变量
FETCH NEXT FROM cur_JLYList INTO @JLYId
--执行sql操作
---日期分表处理
set @tablenames='( HisData'+@JLYId+'.dbo.his'+Datepart(yyyy,@FromTime)+Datepart(mm,@FromTime)
while Datepart(yyyy,@FromTime)!=Datepart(yyyy,@EndTime) or Datepart(mm,@FromTime)!=Datepart(mm,@EndTime)
begin
set @FromTime=Dateadd(m,1,@FromTime)
set @tablenames=@tablenames+' union HisData'+@JLYId+'.dbo.his'+Datepart(yyyy,@FromTime)+Datepart(mm,@FromTime)
end
set @tablenames=@tablenames+') as hisdata'+@jlyid

set @sqlStr = @sqlStr + ' union select * from '+@tablenames
end
print @sqlStr
ENDgo
exec [ds_GetHisData] 'C100158','2010-11-4 00:00:00','2010-11-4 10:00:00'

解决方案 »

  1.   

        ;WITH userorgs(op_upkey,op_name,op_key,op_rank,orglevel)
        AS
        (
            SELECT op_upkey,op_name,op_key,op_rank ,0 AS orglevel FROM organize_info
            WHERE op_key = @OrgId
            UNION ALL
            SELECT l.op_upkey,l.op_name,l.op_key,l.op_rank,orglevel+1 FROM organize_info l 
                INNER JOIN userorgs p ON l.op_upkey=p.op_key
        )
        --with as 后面必须跟着使用表达式的语句,我想把userorgs用在游标cur_JLYList里
        select * from userorgs
        
    ==================
    这一段就是构造出来的一个表,后面就可以当着普通表来处理。
      

  2.   

    消息 208,级别 16,状态 1,过程 ds_GetHisData,第 31 行
    对象名  'userorgs' 无效。
      

  3.   

     Declare @tablenames nvarchar(1024);
        --通过递归取得所有的组织编号
        WITH userorgs(op_upkey,op_name,op_key,op_rank,orglevel)
    有分号呀
      

  4.   

    你把结果写入一个临时表中,再游标调用就可以了select * into #temp from userorgs
      

  5.   


    在2005中可以了,但是2000报with有错误
      

  6.   


    2000里面没有with..as这个语法 
    这个是2005里新的语法 CTE表达式