2016-08-25 18 views
2

私はaを書く必要があります。テーブルを参照し、条件が満たされた場合にレコードを挿入するinsertステートメント。これは一度のことで、それが効率的であることをあまり懸念していません。条件付きSQL挿入

表がその表は、この

ように見えるプロジェクト(各プロジェクトを有する、プロジェクトレベル(wbs1)、位相レベル(WBS2)及びタスクレベル(wbs3)

ための作業分解構造を含みます各プロジェクト(wbs1)に私はWBS2を追加するたとえば、insert文で各プロジェクト(WBS1)に相(WBS2)を挿入する必要が

Wbs1 wbs2 wbs3  name 
    262     ProjectA 
    262  01   Data Analsys 
    262  01  01 Data cleansing 
    262  01  02 Data Transforming 

"02"。

挿入なステートメントを書くことがないです私はプロジェクトのレベルからデータを選択します。そのほとんどはRedunですdantので、そこには問題はない、それはループを持ち、同じプロジェクト(wbs1)数

insert文のサンプル

Insert into dbo.pr ([WBS1],[WBS2],[WBS3],[Name]) 
     (Select [WBS1],'999',[WBS3],'In-House Expenses' 
     from dbo.pr where wbs1 = @ProjectID 
     and wbs2 ='') 
持つ複数の行があるので、各プロジェクトにフェーズを追加する方法だけでわからないイム

すべてのプロジェクトに行を挿入するにはどうすればいいですか?(wbs1)

うまくいけばうまくいきます。

+2

挿入自体は条件付きにすることはできません。 where節はありません。あなたがやっていることは行く道だ。選択結果から挿入し、条件付きで選択できるようにします。 –

+0

これはMS SQL 2014 DBです。 – gringo

+0

特定のプロジェクトのレコードを挿入する場合は、2番目のWHERE条件を削除します。 ([WBS1]、[WBS2]、[WBS3]、[名前]) (dbo.prから[WBS1]、[999]、[WBS3]、[社内経費 ' を選択] wbs1 = @ProjectID) 'は、特定のプロジェクト@ProjectIDの行を挿入する必要があります。 – Eric

答えて

0

RowNumberフィールドが追加された一時テーブルを使用して、WHILEループを使用して、各行のループを処理できます。ストアドプロシージャを実行する前に、IF EXISTSを条件チェックとして実行することができます。下記の例を参照してください。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 

DECLARE @ProjectId NVARCHAR(50) = '262' 

CREATE TABLE #Temp (RowNumber INT, wbs1 NVARCHAR(255), wbs2 NVARCHAR(255),  wbs3 NVARCHAR(255), name NVARCHAR(255)) 

INSERT INTO #Temp 
SELECT ROW_NUMBER() OVER (ORDER BY wbs1, wbs2, wbs3, name) 
,pr.* 
FROM pr 

select * 
from #temp 

-- Create loop variables to handle incremeting 
DECLARE @Counter INT = 1; 
DECLARE @MaxLoop INT = (SELECT COUNT(wbs1) FROM #temp) 

WHILE @Counter <= @MaxLoop 
BEGIN 

-- Use if Exists to check the current looped meets whatever critiera you have 
IF EXISTS (SELECT 'true' 
    FROM #Temp 
    WHERE RowNumber = @Counter 
     AND wbs1 = @ProjectId 
     AND wbs2 = '' 
     ) 
BEGIN 
    Insert into pr (wbs1,wbs2,wbs3,name) 
     (Select [WBS1],'999',[WBS3],'In-House Expenses' 
     from #temp where RowNumber = @Counter) 
END 

-- Remember to increment the counter 
SET @Counter = @Counter + 1; 

END 

SELECT * 
FROM pr 

drop table #temp