2016-08-25 124 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