【问题标题】:Conditional SQL Insert条件 SQL 插入
【发布时间】:2017-01-02 00:37:49
【问题描述】:

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

该表包含项目的工作分解结构(每个项目具有项目级别(wbs1)、阶段级别(wbs2)和任务级别(wbs3)

那张桌子是这样的

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

我需要使用插入语句向每个项目(WBS1)插入一个阶段(WBS2),例如向每个项目(wbs1)添加一个 wbs2“02”。

编写插入语句没有问题,我从项目级别选择数据,因为其中大部分是多余的,所以没有问题,我只是不确定如何让它循环并将阶段添加到每个项目,因为有是具有相同项目(wbs1)编号的多行

插入语句示例

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

如何运行此语句以在每个项目中插入一行?(wbs1)

希望这是有道理的。

【问题讨论】:

  • insert 本身不能成为有条件的。它没有 where 子句。但你正在做的将是要走的路。从选择结果中插入,您可以根据条件进行选择。
  • 这是一个 MS SQL 2014 数据库。
  • 如果要为某个项目插入记录,请删除第二个WHERE 条件。 Insert into dbo.pr ([WBS1],[WBS2],[WBS3],[Name]) (Select [WBS1],'999',[WBS3],'In-House Expenses' from dbo.pr where wbs1 = @ProjectID) 应该为特定项目@ProjectID 插入行。
  • 我不确定我是否清楚地理解了您的问题,但只要您的插入语句示例为该特定 wbs1 记录执行您想要的操作,如果您只是删除它,它也将适用于其余 wbs1 值“其中 wbs1 = @ProjectID”条件。
  • 如何知道为每个 wbs1 值添加一条记录?也许我在这里遗漏了一些非常简单的东西......我假设它必须选择每个 wbs1 并为每个值重新运行一次插入语句,就像一个循环。

标签: sql sql-server tsql sql-server-2014


【解决方案1】:

您可以使用添加了 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多