Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
条件SQL插入_Sql_Sql Server_Tsql_Sql Server 2014 - Fatal编程技术网

条件SQL插入

条件SQL插入,sql,sql-server,tsql,sql-server-2014,Sql,Sql Server,Tsql,Sql Server 2014,我得写封信。insert语句,用于查看表并在满足条件时插入记录。这是一次性的,所以不要过分担心它的效率 该表包含一个项目的工作分解结构,每个项目有一个项目级WBS1、一个阶段级WBS2和一个任务级wbs3 那张桌子看起来像这样 Wbs1 wbs2 wbs3 name 262 ProjectA 262 01 Data Analsys 262 01 01 Data cleans

我得写封信。insert语句,用于查看表并在满足条件时插入记录。这是一次性的,所以不要过分担心它的效率

该表包含一个项目的工作分解结构,每个项目有一个项目级WBS1、一个阶段级WBS2和一个任务级wbs3

那张桌子看起来像这样

  Wbs1    wbs2   wbs3     name
  262                   ProjectA
  262     01            Data Analsys
  262     01      01    Data cleansing
  262     01      02    Data Transforming
我需要使用insert语句向每个项目WBS1插入一个阶段wbs2,例如向每个项目WBS1添加一个wbs2 02

写insert语句没有问题,我从项目级别选择数据,因为大部分数据都是冗余的,所以没有问题,我只是不知道如何让它循环并将阶段添加到每个项目中,因为有多行具有相同的projectwbs1编号

插入语句示例

    Insert into dbo.pr ([WBS1],[WBS2],[WBS3],[Name])
      (Select [WBS1],'999',[WBS3],'In-House Expenses'
      from dbo.pr where wbs1 = @ProjectID
      and wbs2 ='')
如何运行此语句在每个项目中插入一行?wbs1


希望这是有意义的。

您可以使用一个临时表,添加一个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

插入本身不能成为有条件的。它没有where子句。但你现在所做的才是最好的选择。从选择结果中插入,然后选择可以设置条件。这是MS SQL 2014 DB。如果要插入特定项目的记录,请删除第二个WHERE条件。在dbo.pr中插入[WBS1]、[WBS2]、[WBS3]、[Name]从dbo.pr中选择[WBS1]、'999'、[WBS3]、“内部费用”,其中WBS1=@projectd应该为特定项目插入行@projectd。我不确定我是否清楚地理解了您的问题,但只要您的插入语句样本符合您对特定WBS1记录的要求,如果您只删除where wbs1=@projectd条件,它还可以为其余的wbs1值正常工作。它如何知道为每个wbs1值添加一条记录?也许我在这里遗漏了一些非常简单的东西……我假设它必须选择每个wbs1,并为每个值重新运行insert语句一次,就像循环一样。