0

私は全く同じ列の2つのテーブルを持っています。挿入と更新を扱うストアドプロシージャはこれは不可能ですか?

両方とも、自動インクリメントのIDと呼ばれる主識別キーを持っています。

私のプログラムは、データをstaggingテーブルに追加し、この手順でタスクテーブルに追加されるものをフィルタリングします。

Mmyの問題は 私はこの更新ステートメントの後に挿入、 の何らかの理由で私の更新ステートメントが機能しない場合、プロシージャ自体でそれが動作しています。

私のinsert文は、プロシージャ内で単独で動作しますが、このupdate文の下には動作しません。

私が追加されている行がで一致していない場合は、これらの3つのフィールドが行 ツアー deptdate タスク名に

と一致した場合

に私の更新ステートメントは、私のdashboardtasksテーブルに を私duedateを更新したいですこれらの3つのフィールドは、挿入行を新しい行として挿入するのと同じです。

update dashboardtasks set 
     deptdate = s.deptdate, 
     tour = s.tour, 
      tasktype = s.tasktype, 
      [desc] = s.[desc], 
      duedate = s.duedate, 
      compdate = s.compdate, 
      comments = s.comments, 
      agent = s.agent, 
      compby = s.compby, 
      graceperiod = s.graceperiod 
     from staggingtasks as s 
     where 
      s.tour=dashboardtasks.tour and 
      s.taskname=dashboardtasks.taskname and 
      s.deptdate=dashboardtasks.deptdate 


     insert into dashboardtasks (tour, taskname, deptdate, tasktype, [desc], duedate, compdate, comments, agent, compby, graceperiod) 
     select tour, taskname, deptdate, tasktype, [desc], duedate, compdate, comments, agent, compby, graceperiod 
     from staggingtasks as s 
     where not exists (select * 
          from dashboardtasks as d 
          where s.tour=d.tour and 
           s.taskname=d.taskname and 
           s.deptdate=d.deptdate and 
           s.duedate=d.duedate 
         ) 


id int Unchecked 
tour varchar(50) Checked 
taskname varchar(50) Checked 
deptdate varchar(50) Checked 
tasktype varchar(50) Checked 
[desc] varchar(MAX) Checked 
duedate varchar(50) Checked 
compdate varchar(50) Checked 
comments varchar(MAX) Checked 
agent varchar(50) Checked 
compby varchar(50) Checked 
graceperiod varchar(50) Checked 

これらは私のフィールドですが、compby、コメント、compdate、およびDESCはちょうどそこにそれを投げヌル

+0

ちょうどニトピックとして:あなたが使っているのは「ステージング」テーブルと呼ばれるでしょう。 –

+0

ありがとうございました。それを修正する必要があります – MyHeadHurts

答えて

1

ここでは、あなたのクエリを実行します。

は影響を受け

update dashboardtasks1 set 
    tasktype = s.tasktype, 
    [desc] = s.[desc], 
    duedate = s.duedate, 
    compdate = s.compdate, 
    comments = s.comments, 
    agent = s.agent, 
    compby = s.compby, 
    graceperiod = s.graceperiod 
from staggingtasks as s 
where 
    s.tour=dashboardtasks1.tour and 
    s.taskname=dashboardtasks1.taskname and 
    s.deptdate=dashboardtasks1.deptdate 

四行UPDATE文のテストデータ

create table dashboardtasks1(id int identity, tour int, taskname nvarchar(50), deptdate datetime, tasktype nvarchar(50), [desc] nvarchar(50), duedate datetime, compdate datetime, comments nvarchar(50), agent nvarchar(50), compby int, graceperiod int) 
create table staggingtasks(id int, tour int, taskname nvarchar(50), deptdate datetime, tasktype nvarchar(50), [desc] nvarchar(50), duedate datetime, compdate datetime, comments nvarchar(50), agent nvarchar(50), compby int, graceperiod int) 

insert into staggingtasks(id, tour, taskname, deptdate, tasktype, [desc], duedate, compdate, comments, agent, compby, graceperiod) 
    values (62, 3647, 'Request Space', '2011-03-30', 'Land', NULL, '2010-01-06', NULL, NULL, 'PEGGYH', NULL, NULL) 
insert into staggingtasks(id, tour, taskname, deptdate, tasktype, [desc], duedate, compdate, comments, agent, compby, graceperiod) 
    values (81, 505, 'Rel. Space', '2012-02-22', 'Land', NULL, '2011-12-24', NULL, NULL, 'IMANA', NULL, NULL) 
insert into staggingtasks(id, tour, taskname, deptdate, tasktype, [desc], duedate, compdate, comments, agent, compby, graceperiod) 
    values (82, 505, 'Ticket', '2012-02-22', 'Air', NULL, '2012-01-08', NULL, NULL, 'SYLVIAT', NULL, NULL) 
insert into staggingtasks(id, tour, taskname, deptdate, tasktype, [desc], duedate, compdate, comments, agent, compby, graceperiod) 
    values (83, 505, 'Names to Airlines', '2012-02-22', 'Air', NULL, '2012-01-08', NULL, NULL, 'SYLVIAT', NULL, NULL) 
insert into staggingtasks(id, tour, taskname, deptdate, tasktype, [desc], duedate, compdate, comments, agent, compby, graceperiod) 
    values (90, 505, 'Names to Airlines', '2012-02-22', 'Air', NULL, '2012-01-01', NULL, NULL, 'SYLVIAT', NULL, NULL) 
insert into staggingtasks(id, tour, taskname, deptdate, tasktype, [desc], duedate, compdate, comments, agent, compby, graceperiod) 
    values (92, 505, 'Names to Airlines', '2012-02-22', 'Air', NULL, '2012-01-01', NULL, NULL, 'SYLVIAT', NULL, NULL) 

insert into dashboardtasks1(tour, taskname, deptdate, tasktype, [desc], duedate, compdate, comments, agent, compby, graceperiod) 
    values (3647, 'Request Space', '2011-03-30', 'Land', NULL, '2010-11-06', NULL, NULL, 'PEGGYH', NULL, NULL) 
insert into dashboardtasks1(tour, taskname, deptdate, tasktype, [desc], duedate, compdate, comments, agent, compby, graceperiod) 
    values (505, 'Rel. Space', '2012-02-22', 'Land', NULL, '2011-11-24', NULL, NULL, 'IMANA', NULL, NULL) 
insert into dashboardtasks1(tour, taskname, deptdate, tasktype, [desc], duedate, compdate, comments, agent, compby, graceperiod) 
    values (505, 'Ticket', '2012-02-22', 'Air', NULL, '2012-11-08', NULL, NULL, 'SYLVIAT', NULL, NULL) 
insert into dashboardtasks1(tour, taskname, deptdate, tasktype, [desc], duedate, compdate, comments, agent, compby, graceperiod) 
    values (505, 'Names to Airlines', '2012-02-22', 'Air', NULL, '2012-11-08', NULL, NULL, 'SYLVIAT', NULL, NULL) 

実行]を設定します。 dashboardtasks1からの選択は、あなたの

id tour taskname deptdate tasktype desc duedate compdate comments agent compby graceperiod 
1 3647 Request Space 2011-03-30 00:00:00.000 Land NULL 2010-01-06 00:00:00.000 NULL NULL PEGGYH NULL NULL 
2 505 Rel. Space 2012-02-22 00:00:00.000 Land NULL 2011-12-24 00:00:00.000 NULL NULL IMANA NULL NULL 
3 505 Ticket 2012-02-22 00:00:00.000 Air NULL 2012-01-08 00:00:00.000 NULL NULL SYLVIAT NULL NULL 
4 505 Names to Airlines 2012-02-22 00:00:00.000 Air NULL 2012-01-08 00:00:00.000 NULL NULL SYLVIAT NULL NULL 

insert into dashboardtasks1 (tour, taskname, deptdate, tasktype, [desc], duedate, compdate, comments, agent, compby, graceperiod) 
select tour, taskname, deptdate, tasktype, [desc], duedate, compdate, comments, agent, compby, graceperiod 
from staggingtasks as s 
where not exists (select * 
        from dashboardtasks1 as d 
        where s.tour=d.tour and 
         s.taskname=d.taskname and 
         s.deptdate=d.deptdate and 
         s.duedate=d.duedate 
       ) 

2つの行が影響を受けているinsert文を実行し、この結果を与えます。 dashboardtasks1に対するクエリでは、この結果が得られます。

id tour taskname deptdate tasktype desc duedate compdate comments agent compby graceperiod 
1 3647 Request Space 2011-03-30 00:00:00.000 Land NULL 2010-01-06 00:00:00.000 NULL NULL PEGGYH NULL NULL 
2 505 Rel. Space 2012-02-22 00:00:00.000 Land NULL 2011-12-24 00:00:00.000 NULL NULL IMANA NULL NULL 
3 505 Ticket 2012-02-22 00:00:00.000 Air NULL 2012-01-08 00:00:00.000 NULL NULL SYLVIAT NULL NULL 
4 505 Names to Airlines 2012-02-22 00:00:00.000 Air NULL 2012-01-08 00:00:00.000 NULL NULL SYLVIAT NULL NULL 
5 505 Names to Airlines 2012-02-22 00:00:00.000 Air NULL 2012-01-01 00:00:00.000 NULL NULL SYLVIAT NULL NULL 
6 505 Names to Airlines 2012-02-22 00:00:00.000 Air NULL 2012-01-01 00:00:00.000 NULL NULL SYLVIAT NULL NULL 

これは予想される動作/結果ですか?

+0

これはあなたのために働いて待っていますか? – MyHeadHurts

+0

それは私がしたい動作ですが、それは私のために動作しません – MyHeadHurts

+0

答えのテーブルとテストデータで空のDBを試してみてください。あなたのテーブルの構造を私のものと比較してください。日時フィールドなどを使用していますか? –

0

ですが、あなたは、内側とwhere句が参加交換しようとしていますか?このような 何か:

update dashboardtasks set 
    deptdate = s.deptdate, 
    tour = s.tour, 
     tasktype = s.tasktype, 
     [desc] = s.[desc], 
     duedate = s.duedate, 
     compdate = s.compdate, 
     comments = s.comments, 
     agent = s.agent, 
     compby = s.compby, 
     graceperiod = s.graceperiod 
    from staggingtasks as s 
    inner join dashboardtasks on 
     s.tour=dashboardtasks.tour and 
     s.taskname=dashboardtasks.taskname and 
     s.deptdate=dashboardtasks.deptdate 
+0

hmmまだ更新ができませんので、テーブルが更新できないようにしてください。 – MyHeadHurts

0

あなたはUPDATEとINSERT文の間のSELECT文で入れてみましたがありますか?それは、プロシージャがあなたが期待どおりに動作していない理由についての手がかりを与えるかもしれません。

また、where句のs.duedate=d.duedate部分はおそらく冗長です。

+0

どんな種類のselect文ですか?私はストアドプロシージャをifsを使って別々に作成できると思いますか? – MyHeadHurts

+0

ミカエルの答えは、私がセレクトすることで意味するものです。彼は各操作の後にすべてのデータを選択したので、何が起こっているかを見ることができます。 if文を使用して再構成することができます。これは、次回の編集時に読みやすく理解しやすいという利点があります。プロシージャの実行速度は低下します。 –

関連する問題