#sql #sql-server-2000 #database-cursor
#sql #sql-server-2000 #база данных-курсор
Вопрос:
Я хочу создать динамическую команду, используя переменную @SqlQuery. Я также объявил курсор (пример: @myCursor). Как я могу «УСТАНОВИТЬ @myCursor = CURSOR ДЛЯ @SqlQuery». Синтаксис, который я только что отметил, не работает. Я использую SQL 2000.
Комментарии:
1. В этом так много неправильных вещей…
2. Или вы не могли бы использовать курсор, который является предпочтительным подходом. Курсоры крайне вредны для производительности в SQL Server и никогда не должны быть методом выбора в первую очередь. Что-то вроде 95% всех курсоров (по моему личному опыту) можно заменить кодом на основе набора. Выполнение этого динамически еще хуже, поскольку невозможно полностью протестировать.
Ответ №1:
Вам следует взглянуть на проклятие и благословения динамического SQL
Ответ №2:
Вы можете сделать это с помощью sp_executesql
. Просто не забудьте открыть курсор в динамическом SQL.
CREATE PROCEDURE OpenCursor (@query nvarchar(max), @cur cursor VARYING OUTPUT)
AS
DECLARE @sql nvarchar(max)
SET @sql = N'SET @cur = CURSOR STATIC FOR ' @query '; OPEN @cur'
EXEC sp_executesql @sql, N'@cur cursor OUTPUT', @cur OUTPUT
GO
DECLARE @cur cursor
EXEC OpenCursor 'SELECT * FROM sysobjects', @cur OUTPUT
FETCH NEXT FROM @cur