2016-08-25 163 views
2

我必須寫。插入查看錶的插入語句,並在符合條件時插入記錄。這是一次性的事情,所以不要過分擔心它的效率。條件SQL插入

表中包含了一個項目工作分解結構(具有每一個項目,一個項目的水平(wbs1),相位級(WBS2)和任務級(wbs3)

該表看起來像這樣

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

我需要插入一個階段(WBS2)對每個項目(wBS1)與INSERT語句,例如添加WBS2 「02」 每個項目(wbs1)。

編寫插件statment沒有問題,並且我從項目級選擇數據,因爲大部分數據都是重做的唐太斯所以沒有問題存在,我只是不知道如何把它遍歷和相位添加到每一個項目,因爲有同一個項目(wbs1)號

插入語句樣品

Insert into dbo.pr ([WBS1],[WBS2],[WBS3],[Name]) 
     (Select [WBS1],'999',[WBS3],'In-House Expenses' 
     from dbo.pr where wbs1 = @ProjectID 
     and wbs2 ='') 
多行

如何運行此語句INSERTA排每一個項目?(wbs1)

希望這是有道理的。

+2

插入本身不能作出條件。它沒有where子句。但你正在做的是要走的路。從選擇結果插入,並且您可以選擇條件。 –

+0

這是一個MS SQL 2014數據庫。 – gringo

+0

如果您想插入某個項目的記錄,請刪除第二個WHERE條件。 'INSERT INTO dbo.pr([WBS1],[WBS2],[WBS3],[名]) (選擇[WBS1], '999',[WBS3], '內務開支' 從dbo.pr哪裏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