2015-12-18 1 views
0

У меня есть хранимая процедура, которая использует динамический sql для построения сложного запроса для отчета. В какой-то момент он вызывает exec(@sql) прямо перед открытием курсора ... Я считаю, что это ошибка, и команда exec(@sql) может быть удалена, поскольку она выполняется индивидуально и не требуется использовать курсор ...SQL Quursor quandry

Am I правильно? Вот фрагмент:

-- before this it's just doing string concatenation 
SET @sql = N'DECLARE cc CURSOR STATIC FOR ' + @sql 
exec(@Sql) --<-- is this needed here? 
OPEN cc 

Не открывает курсор, эффективно запускает SQL внутри курсора?

ответ

1

Да, это необходимо.

Переменная @sql добавляется с помощью сценария объявления CURSOR непосредственно перед строкой EXEC(@sql). Это делается так, потому что вы не можете объявить курсор со следующим:

DECLARE cc CURSOR STATIC FOR EXECUTE(@sql) 

Вы не можете объявить CURSOR FOR EXEC.

Это было написано таким образом, чтобы обойти это, добавив оператор объявления CURSOR к динамическому SQL. Оригинальный автор не пытался выполнить его в теле CURSOR, а создал CURSOR для набора результатов динамического SQL, который был написан.

Итак, да, это необходимо.

+0

ОК, это имеет смысл. Не используется для неуклюжих динамических SQL-файлов. Не видел это годами. Это более старая система. –

0

Несмотря на то, что я бы посоветовал не использовать курсоры или динамический sql, если это абсолютно необходимо, вам необходимо включить все манипуляции с курсором (и любой другой sql, который работает в одном наборе данных) внутри переменной @sql. В противном случае вы запускаете две полностью отдельные команды sql.

Например:

SET @sql = N'DECLARE cc CURSOR STATIC FOR ' + @sql 
@sql = @sql + 'OPEN cc' 
exec(@sql) 
+0

Я не понимаю, это «да» или «нет»? Я предполагаю, что вы имеете в виду «да, это дублируемая ненужная строка», относящаяся к «exec (@sql)» –

+0

Открытие курсора выполняет sql внутри курсора, но вам все равно нужно извлекать записи и выполнять любую другую обработку вы хотите, который НЕ включен в код курсора. Но, не видя всего вашего кода, я не уверен, что вы пытаетесь сделать здесь. Я думаю, что вы ошиблись. –

+0

Я просто модифицирую/настраиваю существующий беспорядок, который я унаследовал от 90-х ... –

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