私はまだコメントすることができないので、答える前にいくつか質問する必要があります.
1、CTE の名前がビューの名前と同じなのはなぜですか? それは決してうまくいかないはずです。
2、「ID がゼロでないかどうかを確認します。変数 @Start と @End をビュー内の新しいレコードに変更する必要があります」とはどういう意味ですか?なぜ null チェックを行う必要があるのかわかりませんでした
3、DateValue + 1 を使用して次の日付を取得できますか? DATEADD を使用する必要がありますか?
最後に、CTE 内に CTE を含めることはできません。これは機能しません。CTEで変数を宣言することもできません。
これが私の最高のゲストです:
まず、ビューには startdate 列と enddate 列があると述べたように、
ビューに StartDate 列と EndDate 列があると仮定します。ここに私のSQLがあります:
DECLARE @start AS DATETIME
DECLARE @end AS DATETIME
SELECT @start = min(StartDate)
from View_Solidnet_Training
where PK_Training_ID is not null
SELECT @end = max(EndDate)
from View_Solidnet_Training
where PK_Training_ID is not null
;with cte_dates as
(
select @start DateValue
union all
select DateValue + 1
from cte_dates
where DateValue + 1 <= cast(@end as datetime)
)
into OBJ_Availability
select v.PK_Training_ID, DateValue, 'AM', 2, 'Test' --columns from the view
from cte_dates cte
join View_Solidnet_Training v on v.StartDate < cte.DateValue and cte.DateValue < v.EndDate
where v.PK_Training_ID is not null
max() および min 関数は、ビュー内の最新および最古の日付を計算します
次に、CTE cte_dates は @start から @end までの日付のリストを作成します
次に、CTE への結合により、StartDate から EndDate までの範囲内でレコードが繰り返されます。
この助けを願っています
ちなみに、自宅のPCにはSQLがないので、
SELECT @start = min(StartDate)
from View_Solidnet_Training
where PK_Training_ID is not null
実行するかどうかはわかりますが、アイデアを得る必要があります
CTE の代わりに while を使用します。
DECLARE @start AS DATETIME
DECLARE @end AS DATETIME
SELECT @start = min(StartDate)
from View_Solidnet_Training
where PK_Training_ID is not null
SELECT @end = max(EndDate)
from View_Solidnet_Training
where PK_Training_ID is not null
DECLARE @AllDates table
(DateValue datetime)
DECLARE @dCounter datetime
SELECT @dCounter = @start
WHILE @dCounter <= @end
BEGIN
INSERT INTO @AllDates VALUES (@dCounter)
SELECT @dCounter=@dCounter+1
END
insert into OBJ_Availability
select v.PK_Training_ID, DateValue, 'AM', 2, 'Test' --columns from the view
from @AllDates d
join View_Solidnet_Training v on v.StartDate < d.DateValue and d.DateValue < v.EndDate
where v.PK_Training_ID is not null
またはあなたもすることができます
DECLARE @start AS DATETIME
DECLARE @end AS DATETIME
SELECT @start = min(StartDate)
from View_Solidnet_Training
where PK_Training_ID is not null
SELECT @end = max(EndDate)
from View_Solidnet_Training
where PK_Training_ID is not null
DECLARE @dCounter datetime
SELECT @dCounter = @start
WHILE @dCounter <= @end
BEGIN
insert into OBJ_Availability
select v.PK_Training_ID, DateValue, 'AM', 2, 'Test' --columns from the view
from View_Solidnet_Training v
where v on v.StartDate < @dCounter and @dCounter < v.EndDate and v.PK_Training_ID is not null
SELECT @dCounter=@dCounter+1
END