2014-10-06 56 views
0
update rd 
set rd.Identifier = isnull(rd.Identifier1,exec DBName.dbo.GenerateUniqueIdSP @UniqueId OUTPUT) 
from [Try]..RawData rd with (nolock) where rd.Id in (1,2,3,4,5,6,7,8,9) 

在上面的代碼我需要更新Identifier柱,用新生成的UniqueId但我不應該使用一個變量來保存的輸出值,因爲我有在批處理更新多個行。如何在更新語句中使用存儲過程的輸出參數?

我在上面的代碼中出現錯誤。

什麼需要改變?

+0

對於初學者來說,你不能這樣做'ISNULL(東西,EXEC SP)' – Lamak 2014-10-06 17:02:31

+0

「我在上面的代碼中遇到錯誤。」不要讓我們陷入懸念,錯誤是什麼? – LittleBobbyTables 2014-10-06 17:04:52

回答

0

最好將stored procedure更改爲function 或者您需要使用CURSOR並在遊標循環中執行更新。

與功能的更新語句如下所示

update rd 
set rd.Identifier = dbo.GenerateUniqueIdFn() 
from [Try]..RawData rd 
where rd.Id in (1,2,3,4,5,6,7,8,9) and 
rd.Identifier1 is NULL 

與光標它看起來像這樣

DECLARE updateIdentCur CURSOR FOR 
select rd.Id from [Try]..RawData rd 
where rd.Id in (1,2,3,4,5,6,7,8,9) and 
rd.Identifier1 is NULL 


OPEN updateIdentCur 
    FETCH NEXT FROM updateIdentCur into @rId 

WHILE @@FETCH_STATUS = 0 
begin 
    exec DBName.dbo.GenerateUniqueIdSP @UniqueId OUTPUT 
    UPDATE set rd.Identifier = @UniqueId 
    Where rd.Id = @rId 
    FETCH NEXT FROM updateIdentCur into @rId 
end 

close updateIdentCur 
deallocate updateIdentCur 
+0

感謝Rajesh的工作。但我的問題是,我被告知不要使用任何類型的循環或遊標,系統只有這個存儲過程在所有的地方,所以我可能不會被允許將其更改爲函數(我會試着與此討論我的前輩)。有沒有其他的方式可以做到這一點,而不使用循環?如果沒有,我將不得不使用這種方法。 – Pravin 2014-10-07 03:30:55

+0

@Pravin,另一種方法是聲明一個臨時表並使用存儲過程生成許多uniqueid並使用它們 – radar 2014-10-07 03:32:31

+0

這聽起來對我來說是個好選擇。非常感謝 :) – Pravin 2014-10-07 04:28:35