2013-06-04 1 views
0

Я хотел бы decare курсор Tsql, но передайте ему строковую переменную вместо инструкции SELECT. Возможно ли и как вы это сделаете? То, что у меня ниже, не работает. Ищете что-то вроде:Объявить передачу курсора SQL в имени переменной

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 
+2

Существует недокументированная хранимая процедура, называемая sp_msforeachdb, может показаться вам полезной. –

ответ

0

Вы должны сделать весь курсор динамический, и вы должны использовать 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 в SQL Server: Obligatory dynamic SQL info link

+0

Может ли c быть в рамках, после exec? –

+0

@TonyHopkinson Спасибо за подсказку, локальные курсоры не будут работать, см .: http://www.sommarskog.se/dynamic_sql.html#cursor0 Я изменил код. –

Смежные вопросы