2012-08-03 86 views
0

我需要一些幫助與SQL Server光標:SQL Server 2008的光標

Declare @DCursor cursor, @OldIndividualID uniqueIdentifier, 
     @NewIndividualID UniqueIdentifier, @NewUniqueColID uniqueIdentifier 

Set @DCursor = Cursor For 
    Select IndividualID From [MVCOmar2].[dbo].PrideMVCDriver 
    Where UniqueColID='895AE0DE-D2CF-461E-ADA9-14FB8BB59640' 
     Set @NewUniqueColID=NEWID() 
Open @DCursor 
Fetch Next From @DCursor Into @OldIndividualID 
While (@@FETCH_STATUS = 0) 
Begin 
    Set @NewIndividualID=NEWID() 
    INSERT INTO [MVCOmar2].[dbo].[PrideMVCCollisionDiagram] ([IndividualID], [ColDiagram], 
     [dateEntered]  ,[OfficerID]  ,[UniqueColID]  ,[ESDEditDiagram]) 
    SELECT @NewIndividualID,[ColDiagram]  ,[dateEntered]  ,[OfficerID]  , 
     @NewUniqueColID  ,[ESDEditDiagram] 
     FROM [MVCOmar2].[dbo].[PrideMVCCollisionDiagram] 
     WHERE [IndividualID][email protected]; 

    Fetch Next From @DCursor Into @OldIndividualID 
End 

Close @DCursor 
Deallocate @DCursor 

我上面的代碼和Select語句工作正常,返回2行,但出於某種奇怪的原因光標ISN」這意味着插入語句不會插入任何沒有意義的內容,因爲單個ID應該存在。這select語句返回2個人ID,以便插入語句應該工作,但它不是,所以我不知道該怎麼辦...

+4

爲什麼這甚至是光標?沒有它,這個數量級就更簡單了。 – RBarryYoung 2012-08-03 16:56:53

+0

我簡化它SO張貼在,我原來的一個較爲複雜,但錯誤是一樣的 – Bulvak 2012-08-03 16:57:22

回答

5

我建議您不要使用遊標這一點。基於聯接一個簡單的插入會做:

DECLARE @NewCollisionDiagram TABLE (
    IndividualID uniqueidentifier, 
    UniqueCOlID uniqueidentifier 
); 

INSERT MVCOmar2.dbo.PrideMVCCollisionDiagram (
    IndividualID, 
    ColDiagram, 
    dateEntered, 
    OfficerID, 
    UniqueColID, 
    ESDEditDiagram 
) 
SELECT 
    newid() NewIndividualID, //alias not needed but here for clarity 
    CD.ColDiagram, 
    CD.dateEntered, 
    CD.OfficerID, 
    newid() NewUniqueColID, 
    CD.ESDEditDiagram 
OUTPUT 
    inserted.NewIndividualID, 
    inserted.NewUniqueColID 
INTO 
    @NewCollisionDiagram 
FROM 
    MVCOmar2.dbo.PrideMVCCollisionDiagram CD 
    INNER JOIN MVCOmar2.dbo.PrideMVCDriver D 
     ON CD.IndividualID = D.IndividualID 
WHERE 
    D.UniqueColID = '895AE0DE-D2CF-461E-ADA9-14FB8BB59640'; 

現在,如果你需要使用新的NewIndividualIDNewUniqueColID值,可以從@NewCollisionDiagram表中獲取它們。如果你必須使用逐行處理(你正在做一些事情,比如發送電子郵件或創建一個表,這絕對需要它),那麼你只能在最後一秒,在具有最終形式的數據的表上進行處理就在它必須被逐行處理之前。

要盡力解決您所遇到的問題,我建議你調整上述最後一個INSERT語句是一個簡單的SELECT,試試你的過程,看看輸出是你所期望的。你的隱式JOIN邏輯很可能不太正確。

我看到如何你從你插入到相同的表中選擇潛在的不一致,以及是否IndividualID在驅動程序表存在於CollisionDiagram表了。

+0

我簡化它SO張貼在,我原來的一個較爲複雜,但錯誤是一樣的。我會嘗試你的聲明,看看它是否有所作爲。 – Bulvak 2012-08-03 17:17:58

+0

你原來的版本可能更復雜,但我仍然*保證*你可以在連接和變量上做更多的事情,而不是像你現在這樣做。查看我的更新。 – ErikE 2012-08-03 17:40:37

+0

我想你提到的修改,但它沒有工作......還有,我使用光標的原因是因爲固定的每一次「個人」 ID心不是和數量的程序執行這個數字可以通過使用遊標我不同,所以可以自動插入與每次執行時返回的「個人」ID相同的數量。 – Bulvak 2012-08-03 17:43:21