游标只会接受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