2014-01-05 50 views
1

我有一個表變量,其中填充了許多行。我試圖實現的是循環遍歷表變量的每一行,查看ID列是否存在於另一個標準表中,並將該行添加到新創建的表變量中。循環遍歷表變量並將缺失的行插入到新的表變量中

我的代碼如下:

DECLARE 
@Intervention_ID int 

SET @Intervention_ID = 969 

/*---Check if intervention has pre-requisites---*/ 
DECLARE @PreRequisites TABLE 
(
    [Intervention_ID] int 
) 
INSERT INTO @PreRequisites 
(
    [Intervention_ID] 
) 
SELECT IP.[Requisite_ID] 
FROM DI_Intervention_Prerequisites IP 
WHERE 
    IP.[Intervention_ID] = @Intervention_ID 
AND IP.[Prerequisite] = 1 

/*---Check if pre-requisites have been completed---*/ 
DECLARE @Result TABLE 
(
    [Type_ID] int 
    , [Type_Name] nvarchar(max) 
    , [Intervention_ID] int 
    , [Intervention_Name] nvarchar(max) 
) 
WHILE NOT EXISTS 
(
    SELECT TOP 1 1 
    FROM DI_Employee_Intervention EI 
    WHERE 
     EI.[Intervention_ID] = (SELECT [Intervention_ID] FROM @PreRequisites) 
) 
    INSERT INTO @Result 
    (
     [Type_ID] 
     , [Type_Name] 
     , [Intervention_ID] 
     , [Intervention_Name] 
    ) 

正如你所看到的,我停留在代碼的WHILE NOT EXISTS一部分。需要發生的是@PreRequisites內不存在的每行DI_Employee_Intervention,需要將該特定的@PreRequisites行插入@Result

回答

2

爲什麼不只是使用基於集合的方法而不是現在使用的RBAR(逐行式激勵行)程序方法?

喜歡的東西:

INSERT INTO @Result([Type_ID], [Type_Name], [Intervention_ID], [Intervention_Name]) 
    SELECT 
     ... (some columns to match the columns of @Result)...... 
    FROM 
    dbo.DI_Intervention_Prerequisites IP 
    WHERE 
    IP.[Intervention_ID] = @Intervention_ID 
    AND IP.[Prerequisite] = 1 
    AND NOT EXISTS (SELECT * 
        FROM DI_Employee_Intervention EI 
        WHERE EI.[Intervention_ID] = IP.[Intervention_ID]) 

或類似的東西(我不明白你所有的中間步驟,爲什麼你把他們....)

+1

嗨馬克,我當時RBAR方法似乎很好...直到WHERE子句。但我試過你的解決方案,結果是正確的。謝謝 –