0

まず、状況を説明します。

あるテーブル (View_Solidnet_Training) から別のテーブル (OBJ_Availability) にデータを転送したいと考えています。問題が 1 つあります。ビューには Start- と EndDate があります。OBJ_Availabilityすべての日付に 1 つのレコードがあります。したがって、ビューの 1 行には、他のテーブルに複数の行があります。

私はCTEと協力しなければなりません。したがって、カーソルは私にとってオプションではありません。中間は完璧に実行されますが、がゼロでないかどうかを確認するWITHために追加を追加したい場合は、変数をビューの新しいレコードに変更する必要があります。WITHID@Start@End

私の英語が下手で申し訳ありませんが、状況を理解していただければ幸いです。

ここに私のコードがあります:

DECLARE @Start AS DATETIME;
DECLARE @End AS DATETIME;
SET @Start = '2013-04-09';
SET @End = '2013-04-11';
with cte1 as 
(

with cte2 as
(
select @Start as DateValue
union all

select DateValue + 1
from cte2
where DateValue + 1 <= @End
)
into OBJ_Availability  
select 34, DateValue, 'AM', 2, 'Test' from cte2
)
select * from cte1 where PK_Training_ID is not null;

このようなものですが、ビューの情報をどこで取得するのかわかりません。私はどこにも名前を言及したことはありませんか?

4

1 に答える 1

0

私はまだコメントすることができないので、答える前にいくつか質問する必要があります.

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
于 2013-04-09T09:26:34.190 に答える