Tsql 声明传递变量名的SQL游标

Tsql 声明传递变量名的SQL游标,tsql,cursor,Tsql,Cursor,我想取消对Tsql游标的存储,但要向其传递一个字符串变量,而不是SELECT语句。有可能吗?你会怎么做?我下面的东西不起作用。寻找类似于: DECLARE @sql varchar(1000) SET @sql = 'SELECT sysobjects.name FROM [#database#].[dbo].sysobjects' SET @sql = REPLACE(@sql, '#database#', @MyDBName) DECLARE c CURSOR

我想取消对Tsql游标的存储,但要向其传递一个字符串变量,而不是SELECT语句。有可能吗?你会怎么做?我下面的东西不起作用。寻找类似于:

DECLARE @sql varchar(1000)
SET @sql = 'SELECT sysobjects.name 
            FROM [#database#].[dbo].sysobjects' 
SET @sql = REPLACE(@sql, '#database#', @MyDBName) 
DECLARE c CURSOR LOCAL FOR @sql

您必须使整个光标动态,并且必须使用
sp_executesql
,这应该可以:

DECLARE @sql nvarchar(1000) -- needs to be nvarchar!
SET @sql = 'DECLARE c CURSOR FOR SELECT sysobjects.name 
            FROM [#database#].[dbo].sysobjects' 
SET @sql = REPLACE(@sql, '#database#', @MyDBName) 
EXEC sp_executesql @sql
OPEN c
....

但是,当您想在SQL Server中使用动态SQL时,请先阅读这里的内容:

在执行之后,c是否会在范围内?@TonyHopkinson感谢您的提示,本地游标将无法工作,请参阅:我更改了代码。有一个名为sp_msforeachdb的未记录存储过程,您可能会发现它很有用。