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
现在执行的是这个存储过程 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
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这段代码没有执行
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
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
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这段代码没有执行
我笔记本上的小写,客户数据库查出来的是大写,我再调试下其它代码
COLLATE Chinese_PRC_CS_AS
--区分大小写ALTER DATABASE database
COLLATE Chinese_PRC_CI_AS
--不区分大小写
非常感谢!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声明的时候大写,使用的时候小写,另外一个出错的地方
ALTER COLUMN colname nvarchar(100) COLLATE Chinese_PRC_CI_AS
--不区分大小写
ALTER TABLE tb
ALTER COLUMN colname nvarchar(100) COLLATE Chinese_PRC_CS_AS
--区分大小写
可以啊,为什么不可以??
alter database...
今天去客户那里,用
ALTER DATABASE database
COLLATE Chinese_PRC_CI_AS 修改数据库,还是大小写敏感,不知道什么原因,我只有到存储过程中,去一个个修改过来才行。请问是什么缘故。
应该是,上边运行好久医院的HIS、RIS系统
就可能是“防火墙”挡住了这个程序啊