为什么同一个存储过程,在客户哪里不能返回查询结果。   数据库是我从自己机器 备份,然后 还原 到客户机器上的。服务器是SQL2000,是不是有什么设置原因?    
因为没有返回结果,所以我用查询分析器,发先用查询分析器也没有返回结果

解决方案 »

  1.   

    试着执行一下存储过程中的SQL语句看看,分步去执行,看看问题在哪里
      

  2.   

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[P_Appoint]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[P_Appoint]
    GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[P_S_Period]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[P_S_Period]
    GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[P_Search_Shitf]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[P_Search_Shitf]
    GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[P_Search_ShitfList]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[P_Search_ShitfList]
    GOSET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS OFF 
    GO
    CREATE PROCEDURE P_Appoint 
    @MedicalNo NVarChar (50),
    @MedicalName NVarChar (50),
    @DeptID NVarChar (50),
    @PeriodID NVarChar (50),
    @AppointTime datetime,
    @ManCreate NVarChar (50),
    @TimeCreate datetime,
    @ShiftID NVarChar (50),
    @Res NVarChar (100),
    @Descript NVarChar (100),
    @SNO  NVarChar (50) output
    ASdeclare  @Counter  int
    set xact_abort on                                         --这样写,当一个有错误的时候会回滚整个事务
    begin transelect top 1  @Counter=SerialNO from SerialList           ---取得序列号
    set @counter=@counter+1                                   ---序列号+1
    update SerialList set SerialNO=@counter                   ---更新SerialList
    set @SNO=convert(char(8),getdate(),112) + 'LW' + right(@counter+100000000,8)   --日期+序列号insert into AppointList(MedicalNo,MedicalName, 
    DeptID,PeriodID,AppointTime,ManCreate,TimeCreate,ShiftID,SNO,Res,Des)
    values(@MedicalNo,@MedicalName, 
    @DeptID,@PeriodID,@AppointTime,@ManCreate,@TimeCreate,@ShiftID,@SNO,@Res,@Descript)commit tranGO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GOSET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS OFF 
    GO
    CREATE PROCEDURE P_S_Period@ShiftID Nvarchar(50),
    @WeekID Nvarchar(50),
    @DeptID Nvarchar(50),
    @AppointTime datetime AS
    select periodName,tempA.* 
    from periodList pl 
    right join
    (
    select sd.menCount ,isnull(sum(Counter),0 )realCount,sd.periodID,app.deptID,sd.shiftID shiftID,sd.descript descript   from
    (select * from ShiftDetail 
    where ShiftID=@ShiftID and WeekID=@WeekID) sd       --sd指定班次,指定星期的记录
    left join
    (select 1 Counter, * from AppointList               --app指定某天、指定部门:Counter为计数器,以后聚合用
    where convert( varchar(100), AppointTime, 23)=convert( varchar(100), @AppointTime, 23)  and deptID=@deptID) app  
    on sd.periodID = app.periodID  
    group by sd.periodID,app.deptID,sd.menCount,sd.shiftID,descript
    )tempa                                              --tempa 统计sd各个period的人数。
    on tempA.periodID=pl.periodID
    order by tempA.periodID                             --显示分时段periodNameGO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GOSET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO
    CREATE PROCEDURE P_Search_Shitf
    @S_BeginTime datetime ,--开始时间  是由查询的医生提供
    @S_EndTime datetime ,--结束时间
    @DeptID NVarChar(10) ,--部门编号
    @ShiftID NVarChar(10)
    AS--作用:查询出一段时间,每日预约人数上限,实际预约人数
    select ShiftSet.ID ID, ShiftSet.weekName,sumCount,ShiftSet.deptID,ShiftSet.timeSerial,actualCount,BeginTime,EndTime from(
    select tempB.ID ID, TableSerial.weekName,Isnull( tempB.sumCount,0) sumCount,tempB.deptID deptID,TableSerial.timeSerial,BeginTime,EndTime from (
    --作用:获取两个时间之内的所有日期
    --表别名:TableSerial
    --字段名:timeSerial,weekName
    select  
      dateadd(dd,number,@S_BeginTime) as timeSerial,datename(weekday,dateadd(dd,number,@S_BeginTime) )  weekName
    from
      master..spt_values
    where
      type='p'
    and  
      dateadd(dd,number,@S_BeginTime)<=@S_EndTime
    )  TableSerial join
    --作用:统计某科室周一 到 周日 ,每日设置预约人数上限
    --shift 预约设置主表;ID:主键,deptID科室ID
    --(这2个字段这里暂时没用:BeginTime:起效时间--EndTime终止时间)
    --shiftDetail 预约设置明细  shiftID:主表对应ID;menCount:每个时段预约人数上限 ;weekID(1..7)
    --(这里暂时没用:PeriodID 分时段ID)
    --weekList 星期列表;weekID(1..7) weekName(星期一..星期日)--表别名:TempA,TempB
    --参数:@ShiftID
    (
    select TempA.id ID, weekName,sumCount,deptID,BeginTime,EndTime from weekList,
    (select s.id ID, sum(menCount) sumCount,weekID,s.deptID ,BeginTime,EndTime
    from shift s,shiftDetail sd  
    where  s.id=@ShiftID and sd.shiftID = s.id                                   --and s.deptID = @DeptID  
    group by weekID,s.deptID,BeginTime,EndTime,s.id ) TempA                 --聚合:统计指定班次的人数上限   返回结果:班次ID,人数总和,星期ID,部门ID,开始时间,结束时间
    where weekList.weekID = TempA.weekID 
    ) TempB                                                                 --把上边的WeekID,转换成WeekName 返回结果:其他照旧on TempB.weekName = TableSerial.weekName  and  timeSerial>=BeginTime and timeSerial<=EndTime  --必须有记录的有效期
    ) ShiftSet                                                              --跟时间序列表连接起来           返回结果:同上             
    left join(
                                                                            --作用:统计某日、某门诊的已经预约人数。  
    --AppointList 是预约病人流水表。 deptID:预约门诊,appointTime:预约时间。
    --参数:@DeptID
    select count(*) actualCount,deptID,convert( varchar(100), AppointTime, 23) appointTime
    from AppointList
    where deptID = @DeptID  and   convert( varchar(100), AppointTime, 23) >=@S_BeginTime and  convert( varchar(100), AppointTime, 23)<=@S_EndTime                  --这里应该加个时间范围!!!!@
    group by  convert( varchar(100), AppointTime, 23) ,deptID
    )Appon    App.appointTime=ShiftSet.timeSerial  --App.deptID=ShiftSet.deptID  and
    order by timeSerial
    GO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GOSET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS ON 
    GO
    CREATE PROCEDURE P_Search_ShitfList
    @S_BeginTime datetime ,          --开始时间  是由查询的医生提供
    @S_EndTime datetime ,            --结束时间
    @DeptID NVarChar(50),            --部门编号
    @AllDate  bit                              --是否显示所有日期                                                                    ASset @S_BeginTime=convert( varchar(100), @S_BeginTime, 23)  --标准化时间格式declare @ShiftID int
    declare Shift_Cur cursor  for 
    select id  from shift where deptID= @DeptID  and   cancel=1                                                       --设置游标:获取被激活的部门。create table #T1                                                                                                                            --创建临时表,为插入记录准备。
    (
    ID Nvarchar(50),
    weekName Nvarchar(50),                   --星期
    sumCount Nvarchar(50),                     --合计上限
    deptID Nvarchar(50),                          --部门ID
    timeSerial datetime,                             --时间流水
    actualCount Nvarchar(50),                  --实际人数
    beginTime Nvarchar(50),                     --开始时间
    endTime Nvarchar(50)                         --结束时间
    )open Shift_Cur                                                                                                                                 --打开游标
    fetch next from Shift_Cur into @ShiftID
    while @@fetch_status=0
    begin   --exec P_Search_Shitf '2012-02-01','2012-02-28','3','8'
       --print ltrim(str(@ShiftID))
       insert into #T1 exec P_Search_Shitf @S_BeginTime,@S_EndTime,@DeptID,@ShiftID          --执行子存储过程,数据插入#T1
       fetch next from Shift_Cur into @ShiftID
    endif  @AllDate =1
    beginselect TableSerial.timeSerial,#T1.*  from                                                                                        --填补空档期,左连接。
    (
    --作用:获取两个时间之内的所有日期
    --表别名:TableSerial
    --字段名:timeSerial
    select                                                                                                                                            --产生时间序列
      dateadd(dd,number,@S_BeginTime) as timeSerial
    from
      master..spt_values
    where
      type='p'
    and  
      dateadd(dd,number,@S_BeginTime)<=@S_EndTime
    )  TableSerial left join #T1 
    on TableSerial.timeSerial = #T1.timeSerial
    order by TableSerial.timeSerialend  --end if
    else
    select  *  from  #T1 order by timeSerial
    --select * from #T1 order by timeSerial
    close Shift_Cur            --关闭游标
    deallocate Shift_Cur    --释放游标
    GO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO
      

  3.   

    现在执行的是这个存储过程
    CREATE PROCEDURE P_Search_ShitfList
    @S_BeginTime datetime ,          --开始时间  是由查询的医生提供
    @S_EndTime datetime ,            --结束时间
    @DeptID NVarChar(50),            --部门编号
    @AllDate  bit                              --是否显示所有日期                                                                    ASset @S_BeginTime=convert( varchar(100), @S_BeginTime, 23)  --标准化时间格式declare @ShiftID int
    declare Shift_Cur cursor  for 
    select id  from shift where deptID= @DeptID  and   cancel=1                                                       --设置游标:获取被激活的部门。create table #T1                                                                                                                            --创建临时表,为插入记录准备。
    (
    ID Nvarchar(50),
    weekName Nvarchar(50),                   --星期
    sumCount Nvarchar(50),                     --合计上限
    deptID Nvarchar(50),                          --部门ID
    timeSerial datetime,                             --时间流水
    actualCount Nvarchar(50),                  --实际人数
    beginTime Nvarchar(50),                     --开始时间
    endTime Nvarchar(50)                         --结束时间
    )open Shift_Cur                                                                                                                                 --打开游标
    fetch next from Shift_Cur into @ShiftID
    while @@fetch_status=0
    begin   --exec P_Search_Shitf '2012-02-01','2012-02-28','3','8'
       --print ltrim(str(@ShiftID))
       insert into #T1 exec P_Search_Shitf @S_BeginTime,@S_EndTime,@DeptID,@ShiftID          --执行子存储过程,数据插入#T1
       fetch next from Shift_Cur into @ShiftID
    endif  @AllDate =1
    beginselect TableSerial.timeSerial,#T1.*  from                                                                                        --填补空档期,左连接。
    (
    --作用:获取两个时间之内的所有日期
    --表别名:TableSerial
    --字段名:timeSerial
    select                                                                                                                                            --产生时间序列
      dateadd(dd,number,@S_BeginTime) as timeSerial
    from
      master..spt_values
    where
      type='p'
    and  
      dateadd(dd,number,@S_BeginTime)<=@S_EndTime
    )  TableSerial left join #T1 
    on TableSerial.timeSerial = #T1.timeSerial
    order by TableSerial.timeSerialend  --end if
    else
    select  *  from  #T1 order by timeSerial
    --select * from #T1 order by timeSerial
    close Shift_Cur            --关闭游标
    deallocate Shift_Cur    --释放游标
    GO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO
      

  4.   


    declare 
    @S_BeginTime datetime ,
    @S_EndTime datetime
    set @S_BeginTime='2012-02-1'
    set @S_EndTime='2012-03-29'select  
      dateadd(dd,number,@S_BeginTime) as timeSerial,datename(weekday,dateadd(dd,number,@S_BeginTime) )  weekName
    from
      master..spt_values
    where
      type='p'
    and  
      dateadd(dd,number,@S_BeginTime)<=@S_EndTime这段代码没有执行
      

  5.   

    type='p'
    我笔记本上的小写,客户数据库查出来的是大写,我再调试下其它代码
      

  6.   

    ALTER DATABASE database 
    COLLATE Chinese_PRC_CS_AS 
    --区分大小写ALTER DATABASE database 
     COLLATE Chinese_PRC_CI_AS 
    --不区分大小写
      

  7.   


    非常感谢!CREATE PROCEDURE P_S_Period@ShiftID Nvarchar(50),
    @WeekID Nvarchar(50),
    @DeptID Nvarchar(50),
    @AppointTime datetime ASwhere convert( varchar(100), AppointTime, 23)=convert( varchar(100), @AppointTime, 23)  and deptID=@deptID声明的时候大写,使用的时候小写,另外一个出错的地方
      

  8.   

    可针对某个表:ALTER TABLE tb
     ALTER COLUMN colname nvarchar(100) COLLATE Chinese_PRC_CI_AS 
    --不区分大小写
    ALTER TABLE tb 
     ALTER COLUMN colname nvarchar(100) COLLATE Chinese_PRC_CS_AS 
    --区分大小写
      

  9.   

    那个服务器上,有好几个数据库,我只修改我的yuyue这个数据库可以吗?
      

  10.   


    可以啊,为什么不可以??
    alter database...
      

  11.   

      
    今天去客户那里,用
    ALTER DATABASE database 
     COLLATE Chinese_PRC_CI_AS 修改数据库,还是大小写敏感,不知道什么原因,我只有到存储过程中,去一个个修改过来才行。请问是什么缘故。
      

  12.   


    应该是,上边运行好久医院的HIS、RIS系统
      

  13.   

    如果你确定 客户端的电脑能连接到那台MSSQL数据库的话,
    就可能是“防火墙”挡住了这个程序啊