2012-07-03 81 views
0
數據庫

任何人可以幫助我完成這個任務..循環通過與光標更新記錄

FirstName LastName EmpNumber EffectiveFrom EffectiveTo JobTitle 
     john  A  EMP01  2004-05-01  2005-09-01  credit officer 
     NULL  NULL  NULL  2005-09-01  2006-30-01  chief credit officer 
     NULL  NULL  NULL  2006-30-01  2006-30-09 
     george B  EMP02  
     david C  EMP03 
     NULL  NULL  NULL 
     NULL  NULL  NULL 

我有這樣的桌子,想用光標來更新它看起來像這樣 我沒有寫的所有數據只是一些記錄

FirstName LastName EmpNumber EffectiveFrom EffectiveTo JobTitle 
    john  A  EMP01 
    john  A  EMP01 
    john  A  EMP01 
    george B  EMP02 
    david  C  EMP03 
    david  C  EMP03 
    david  C  EMP03 
+2

什麼是您的列名?是單行中的所有數據,還是有3行? – Sean

+0

爲什麼你要創建重複?只需刪除'null'行:'從col_l爲null且col2爲空且col3爲空'的your_table中刪除' –

+0

好吧,現在沒有什麼區別NULL記錄,所以你不能告訴它哪一行要更新。有沒有其他的專欄你沒有顯示? – Sean

回答

0

創建變量來保存找到的最後一個不爲空值:@FirstNameNN, @LastNameNN, @EmpNumberNN.

創建一個遊標並獲取每行保存其數據爲VAR iables(@FirstName, @LastName, @EmpNumber, @EffectiveFrom, @EffectiveTo, @JobTitle)。

在每個光標迭代,做這樣的事情:

IF @FirstName IS NOT NULL 
BEGIN 
    SET @FirstNameNN = @FirstName 
    SET @LastNameNN = @LastName 
    SET @EmpNumberNN = @EmpNumber 
END 
ELSE 
BEGIN 
    UPDATE Employees 
     SET FirstName = @FirstNameNN, 
      LastName = @LastNameNN, 
      EmpNumber = @EmpNumberNN 
    WHERE EffectiveFrom = @EffectiveFrom AND 
      EffectiveTo = @EffectiveTo AND 
      JobTitle = @JobTitle 
END 

當然,如果有兩排與最後三列都是平等的,這個代碼將會失敗。

+1

我想補充的是,首先:在表中添加一個IDENTITY列。其次,確保數據按照該列的正確順序排列。第三,創建遊標應該由新的IDENTITY列排序。第四,現在可以使用IDENTITY列而不是使用上面的WHERE子句進行更新。第五,放下IDENTITY列。 – Sean

+1

如果您有IDENTITY列,您甚至可以在沒有遊標的情況下執行更新。只需將表連接回自己,其中連接的表ID是<主表ID,並且連接的表ID是max(ID不爲空)。如果這是有道理的。然後它只是一個查詢更新。 – Sean

+0

@SeanW我同意你的評論。遊標是邪惡的,但我認爲這是一次性操作,所以這不是什麼大問題。這woldn't那麼容易確保ID列將按照這個順序的信息,我真的希望OP是尋求幫助的,以開始使用更好的過程,其中的所有記錄都存儲有充分數據清理這個數據。 – daniloquio

0

我也用光標做過,只是複製了@daniloquio代碼中的語句。

DECLARE @NAME NVARCHAR(500), @LastName NVARCHAR(500), @EmpN NVARCHAR(500), @TN NVARCHAR(500), @TLN NVARCHAR(500), @TEN NVARCHAR(500), 
       @EffectiveFrom DATETIME,@EffectiveTo DATETIME,@JobTitle NVARCHAR(500) 

DECLARE temp CURSOR FOR 
    SELECT Name, [Last Name], [Employee Number], [Effective From], [Effective To], [Job Title] 
    FROM dbo.Positions$ 

    OPEN temp  

FETCH NEXT FROM temp INTO @Name, @LastName, @EmpN, @EffectiveFrom, @EffectiveTo, @JobTitle 

WHILE @@FETCH_STATUS=0 
BEGIN 
    SELECT @Name, @LastName, @EmpN 

    IF @NAME IS NOT NULL 
    BEGIN 
     SELECT @[email protected], @[email protected], @[email protected] 
    END 
    ELSE 
    BEGIN 
     UPDATE dbo.Positions$ 
     SET [email protected], 
       [Last Name][email protected], 
       [Employee Number][email protected] 
     WHERE [Effective From] = @EffectiveFrom AND 
      [Effective To] = @EffectiveTo AND 
      [Job Title] = @JobTitle 
    END 


    FETCH NEXT FROM temp INTO @Name, @LastName, @EmpN, @EffectiveFrom, @EffectiveTo, @JobTitle 
END 
CLOSE temp; 
DEALLOCATE temp;