遊標只會接受select語句,所以如果SQL確實需要動態化,請將執行語句的declare cursor部分。對於下面的工作你的服務器將不得不使用全局遊標。
Declare @UserID varchar(100)
declare @sqlstatement nvarchar(4000)
--move declare cursor into sql to be executed
set @sqlstatement = 'Declare users_cursor CURSOR FOR SELECT userId FROM users'
exec sp_executesql @sqlstatement
OPEN users_cursor
FETCH NEXT FROM users_cursor
INTO @UserId
WHILE @@FETCH_STATUS = 0
BEGIN
Print @UserID
EXEC asp_DoSomethingStoredProc @UserId
FETCH NEXT FROM users_cursor --have to fetch again within loop
INTO @UserId
END
CLOSE users_cursor
DEALLOCATE users_cursor
如果你需要避免使用遊標全球,您也可以將您的動態SQL結果到一個臨時表中,然後使用該表來填充你的光標。
Declare @UserID varchar(100)
create table #users (UserID varchar(100))
declare @sqlstatement nvarchar(4000)
set @sqlstatement = 'Insert into #users (userID) SELECT userId FROM users'
exec(@sqlstatement)
declare users_cursor cursor for Select UserId from #Users
OPEN users_cursor
FETCH NEXT FROM users_cursor
INTO @UserId
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC asp_DoSomethingStoredProc @UserId
FETCH NEXT FROM users_cursor
INTO @UserId
END
CLOSE users_cursor
DEALLOCATE users_cursor
drop table #users
光標使用
示例中的「正確」的方法是不使用動態SQL或遊標。你能舉一個你想要完成的事情的真實例子嗎? – NotMe 2009-06-25 20:19:12
準確地說 - 單個存儲過程中SQL服務器的兩個大NO-NO :-) – 2009-06-25 20:29:50
動態SQL不一定是邪惡的,特別是如果您使用sp_executesql而不是EXEC。遊標,雖然被詛咒。 – RolandTumble 2009-06-25 21:53:24