我有2张桌子
Person
,列PersonID
(integer
)CarePlanReport
包含PersonID
列(integer
),Shift(nvarchar(5)
- 将保留文字值'day'或'night'),{{1} (CarePlanDate
),datetime
(Details
)我需要一个存储过程,该过程将针对当前月份的所有日期,如果不是nvarchar(50)
,则为每个CarePlanReport
(白班和夜班)插入2条记录已经存在。这是因为每个人都需要当月的每一天的白天和夜班记录。问题是可以在当月的任何一天添加新人,并且需要添加缺失的记录 - 因此该过程需要在任何给定月份中多次运行。现有记录将保持不变,因为它们已经存储了重要的详细信息。
实施例
Person.PersonID
表持有:
Person
PersonId
--------
1
2
暂存当月
CarePlanReport
我用它来返回当月的所有日期(不确定它是否是最有效的方法)
PersonID Shirt CarePlanDate
----------------------------------
1 day 2015/03/01
2 day 2015/03/01
1 night 2015/03/01
2 night 2015/03/01
.. and so on for each day in the month ....
1 day 2015/03/31
2 day 2015/03/31
1 night 2015/03/31
2 night 2015/03/31
答案 0 :(得分:1)
@tfa
如果你编写一个触发器并且应该作为插入Person Table中的新记录调用它会很好。如果有任何需要,请告诉我。您必须在触发器中设置几组验证 使用以下程序,为每个personid插入“day”和“night”记录。只需要在一个月内调用一次。
create procedure [dbo].[InsertsRecords]
as
begin
DECLARE @DATE DATETIME
declare @NoOfDays int
declare @lv_count int =1
declare @LastDateOfMonth date
declare @getdates date
declare @lv_personid int
declare @FirstDateOfMonth date
SET @DATE=convert(date,getdate())
set @LastDateOfMonth =(select DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@date)+1,0)))
set @FirstDateOfMonth=(SELECT convert(date,DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0)))
declare rcds_cur cursor for
select personid from dbo.person where personid not in (select personid from dbo.CarePlanReport between
@FirstDateOfMonth and @LastDateOfMonth )
open rcds_cur
FETCH NEXT FROM rcds_cur into @lv_personid
while @@FETCH_STATUS=0
begin
set @NoOfDays=( Select Day(EOMONTH(@DATE)) AS [Current Month])
set @NoOfDays=@NoOfDays-1
while (@lv_count<=@NoOfDays)
begin
set @getdates=(select DATEADD(dd,-@lv_count , @LastDateOfMonth))
insert into dbo.CarePlanReport values (@lv_personid,'day',@getdates,'day shift')
insert into dbo.CarePlanReport values (@lv_personid,'night',@getdates,'night shift')
set @lv_count=@lv_count+1
end
FETCH NEXT FROM rcds_cur into @lv_personid
end
close rcds_cur
deallocate rcds_cur
end