DECLARE @Request nvarchar(MAX)
SET @Request = 'SELECT... UNION SELECT ... и т. д.'
DECLARE curs CURSOR FOR @Request
Запрос для курсора с неизвестным количеством таблиц
Код:
...но компилироваться такое объявление не хочет. Возможно ли как-то по другому объявить курсор? MS SQL 2008.
тут. Задача сводится к конструированию строки с запросом и передачи ее в EXEC.
Посмотрите
оно:
Спасибо, то что нужно! Вот
Код:
declare @query nvarchar(250)
set @query = 'declare cur cursor global forward_only static read_only FOR SELECT MyFiled from ' + @table
exec (@query)
...
set @query = 'declare cur cursor global forward_only static read_only FOR SELECT MyFiled from ' + @table
exec (@query)
...
Вот досада! Динамические запросы не работают в пользовательских функциях. :( Зато вроде работают в хранимых процедурах. Попробую создать курсор в хр. процедуре и возвращать его как OUTPUT в функцию...
Код:
DECLARE @VarValue AS float
DECLARE @Validity AS smallint
DECLARE @Time_ms AS float(53)
...
/*Вот эта работает:*/
INSERT INTO ##xxx VALUES (@VarValue, @Validity, @Time_ms)
/*А вот эта нет:*/
EXEC('INSERT INTO ##xxx VALUES (@VarValue, @Validity, @Time_ms)')
DECLARE @Validity AS smallint
DECLARE @Time_ms AS float(53)
...
/*Вот эта работает:*/
INSERT INTO ##xxx VALUES (@VarValue, @Validity, @Time_ms)
/*А вот эта нет:*/
EXEC('INSERT INTO ##xxx VALUES (@VarValue, @Validity, @Time_ms)')
Во втором случае выдается ошибка Must declare the scalar variable "@VarValue". Никак не пойму, почему? Тем более до этого места другие динамические запросы, DECLARE CURSOR, например, работают нормально.
З.Ы. Можно было бы, конечно, конвертировать @VarValue в строковую переменную и таким образом составить запрос, но как-то это нецелесообразно, потому что в цикле эта строчка вызывается порядка 2000 раз.
Цитата: artem_kvadro
Пишу в хранимой процедуре такие вот строчки:
Во втором случае выдается ошибка Must declare the scalar variable "@VarValue". Никак не пойму, почему? Тем более до этого места другие динамические запросы, DECLARE CURSOR, например, работают нормально.
З.Ы. Можно было бы, конечно, конвертировать @VarValue в строковую переменную и таким образом составить запрос, но как-то это нецелесообразно, потому что в цикле эта строчка вызывается порядка 2000 раз.
Код:
DECLARE @VarValue AS float
DECLARE @Validity AS smallint
DECLARE @Time_ms AS float(53)
...
/*Вот эта работает:*/
INSERT INTO ##xxx VALUES (@VarValue, @Validity, @Time_ms)
/*А вот эта нет:*/
EXEC('INSERT INTO ##xxx VALUES (@VarValue, @Validity, @Time_ms)')
DECLARE @Validity AS smallint
DECLARE @Time_ms AS float(53)
...
/*Вот эта работает:*/
INSERT INTO ##xxx VALUES (@VarValue, @Validity, @Time_ms)
/*А вот эта нет:*/
EXEC('INSERT INTO ##xxx VALUES (@VarValue, @Validity, @Time_ms)')
Во втором случае выдается ошибка Must declare the scalar variable "@VarValue". Никак не пойму, почему? Тем более до этого места другие динамические запросы, DECLARE CURSOR, например, работают нормально.
З.Ы. Можно было бы, конечно, конвертировать @VarValue в строковую переменную и таким образом составить запрос, но как-то это нецелесообразно, потому что в цикле эта строчка вызывается порядка 2000 раз.
так по тексту ошибки ж ясно вроде.
попробуйте объявить переменные "внутри" EXEC:
[highlight=sql]
EXEC('
DECLARE @VarValue AS float
DECLARE @Validity AS smallint
DECLARE @Time_ms AS float(53)
INSERT INTO ##xxx VALUES (@VarValue, @Validity, @Time_ms)
')
[/highlight]
По тексту ясно, что нужно объявить переменную, но они же у меня уже объявлены выше в теле процедуры. Или я что-то не понимаю в принципе работы динамических запросов? Недавно только начал разбираться с T-SQL.
Так, как Вы предлагаете, пробовал - работает. Но мне нужно сначала в эти переменные считать из курсора каждую @n-ную строку, а потом записать их значения во временную таблицу:
Код:
DECLARE @VarValue AS float
DECLARE @Validity AS smallint
DECLARE @Time_ms AS float(53)
...
DECLARE @InsertTmpTableQuery AS nvarchar(250)
SET @InsertTmpTableQuery = N'INSERT INTO ' + @TmpTableName +
N' VALUES (@VarValue, @Validity, @Time_ms)'
...
/*Выборка из курсора*/
WHILE @@FETCH_STATUS = 0
BEGIN
EXECUTE(@InsertTmpTableQuery)
FETCH RELATIVE @n FROM curs
INTO @VarValue, @Validity, @Time_ms
END
...
DECLARE @Validity AS smallint
DECLARE @Time_ms AS float(53)
...
DECLARE @InsertTmpTableQuery AS nvarchar(250)
SET @InsertTmpTableQuery = N'INSERT INTO ' + @TmpTableName +
N' VALUES (@VarValue, @Validity, @Time_ms)'
...
/*Выборка из курсора*/
WHILE @@FETCH_STATUS = 0
BEGIN
EXECUTE(@InsertTmpTableQuery)
FETCH RELATIVE @n FROM curs
INTO @VarValue, @Validity, @Time_ms
END
...
Получается, нужно тогда в теле цикла каждый раз составлять строку с запросом с помощью CONVERT, так?