Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как в динамический запрос запихнуть переменную? / 17 сообщений из 17, страница 1 из 1
06.11.2002, 15:05:11
    #32065431
Uriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в динамический запрос запихнуть переменную?
К примеру есть 30 переменных названных в порядке возростания (@1, @2, @3 ....) и их нужно последовательно передать в хранимую процедуру ( exec sp_tmp @1 ).
Я пишу цикл в котором использую динамический запрос:


declare @i int, @sql nchar(15), @1 int
set @i=1
set @1=5
while @i<=30
begin
set @sql='exec sp_tmp @' + cast(@i as nchar(2))
exec (@sql)
set @i=@i+1
end


В ответ получаю сообщения:
Server: Msg 137, Level 15, State 2, Line 1
Must declare the variable '@1'.
Server: Msg 137, Level 15, State 2, Line 1
Must declare the variable '@2'.
Server: Msg 137, Level 15, State 2, Line 1
Must declare the variable '@3'.....
........
Выходит что не видит он моих переменных.
Что сделать чтобы динамический запрос видел мои переменные или как их передать в него по другому.
(но только именно в цикле)
...
Рейтинг: 0 / 0
06.11.2002, 15:10:13
    #32065438
fima
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в динамический запрос запихнуть переменную?
В динамический запрос надо передавать не названия переменных, а значения переменных
...
Рейтинг: 0 / 0
06.11.2002, 15:15:56
    #32065442
Uriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в динамический запрос запихнуть переменную?
2>fima
Я это прекрасно понимаю, но как это сделать в моем примере???
...
Рейтинг: 0 / 0
06.11.2002, 15:26:25
    #32065449
fima
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в динамический запрос запихнуть переменную?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare @i int, @sql nchar( 15 ), @ 1  int 
set @i= 1  
set @ 1 = 5  
while @i<= 30  
begin 
set @sql='exec sp_tmp ' + cast(@i as nchar( 2 )) 
exec (@sql) 
set @i=@i+ 1  
end
...
Рейтинг: 0 / 0
06.11.2002, 15:36:18
    #32065456
Uriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в динамический запрос запихнуть переменную?
2>fima

Но мне нужно передать значение переменной @1 которая равна 5, а не значение переменной @i которая равна 1???
...
Рейтинг: 0 / 0
06.11.2002, 15:49:40
    #32065468
fima
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в динамический запрос запихнуть переменную?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
declare @i int,
	@ 1  int,
	@ 2  int,
	@sql nchar( 15 ),
set @i= 1  
set @ 1 = 5 
set @i =  10 
while @i<= 2  
begin 
	select @sql = case
		when @i =  1  then 'exec sp_tmp ' + cast(@ 1  as nchar( 2 )) 
		when @i =  2  then 'exec sp_tmp ' + cast(@ 2  as nchar( 2 )) 
	exec (@sql) 
	set @i=@i+ 1  
end
...
Рейтинг: 0 / 0
06.11.2002, 16:17:05
    #32065490
Uriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в динамический запрос запихнуть переменную?
2>fima
Дело в том что я привел пример с 30 переменными, а на самом деле их гораздо больше, к тому же после вызова процедуры выполняются другие операции с данными которые возвращает функция - поэтому то я и хочу попробовать записать вызов процедуры в одну строку, а не писать сто одинаковых строк.
Но за поддержание диалога спасибо!!!
...
Рейтинг: 0 / 0
06.11.2002, 16:20:36
    #32065492
fima
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в динамический запрос запихнуть переменную?
ну тогда записывайте значения не в переменные а в таблицу, и ходите по ней...
...
Рейтинг: 0 / 0
06.11.2002, 16:38:39
    #32065512
Uriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в динамический запрос запихнуть переменную?
Дело в том, что данные в переменные попадают из курсора, а способа вставить из курсора данные прямо во временную таблицу без использования переменных я не нашел. Может знаешь другие варианты???
...
Рейтинг: 0 / 0
06.11.2002, 17:14:22
    #32065542
fima
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в динамический запрос запихнуть переменную?
из курсора не знаю, но можно поробовать без курсора.
...
Рейтинг: 0 / 0
06.11.2002, 17:21:59
    #32065551
Uriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в динамический запрос запихнуть переменную?
Каким образом???
...
Рейтинг: 0 / 0
06.11.2002, 17:30:33
    #32065558
fima
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в динамический запрос запихнуть переменную?
понятия не имею, я ж Вашу задачу не знаю, я пока обхожусь без курсоров. Может и у Вас можно без него, а может нельзя.
...
Рейтинг: 0 / 0
06.11.2002, 18:46:59
    #32065583
Cepera
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в динамический запрос запихнуть переменную?
BOL:

Код: plaintext
1.
2.
3.
4.
5.
sp_executesql [@stmt =] stmt
[ 
    {, [@params =] N'@parameter_name  data_type [,...n]' } 
    {, [@param1 =] 'value1' [,...n] }
]
...
Рейтинг: 0 / 0
06.11.2002, 22:17:10
    #32065617
Gobzo Kobler
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в динамический запрос запихнуть переменную?
В консерватории что-то подправить надо. У вас ошибка дизайна и надо не сражаться с 30 переменными, а изменить подход. Советую привести более подробное описание задачи и в 99% случаев, я уверен, удастся обойтись JOIN.
Курсоров вообще следует избегать как бешеных собак.
...
Рейтинг: 0 / 0
07.11.2002, 14:01:12
    #32065680
Uriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в динамический запрос запихнуть переменную?
Курсоров вообще следует избегать как бешеных собак.

2>Gobzo Kobler
Может пояснишь почему???
...
Рейтинг: 0 / 0
07.11.2002, 18:59:48
    #32065766
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в динамический запрос запихнуть переменную?
Наверное потому, что скрипт
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE mycursor CURSOR FOR SELECT * FROM sysobjects

OPEN mycursor
FETCH NEXT FROM mycursor 
WHILE @@FETCH_STATUS =  0 
BEGIN
	FETCH NEXT FROM mycursor 
END
CLOSE mycursor
DEALLOCATE mycursor


Работает в несколько раз медленне, чем

Код: plaintext
select * from sysobjects
...
Рейтинг: 0 / 0
08.11.2002, 16:55:49
    #32065886
Gobzo Kobler
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в динамический запрос запихнуть переменную?
Урий:

Потому, что их надо декларировать, открывать, закрывать и освобождать из памяти. За тебя это никто не сделает, следовательно есть место для ошибки. Это занимает время и ресурсы сервера, следовательно замедляет обработку.

Код: plaintext
1.
2.
3.
4.
5.
while  1 = 1 
begin
   select top  1  @id = id from #a where @id < id order by id
   if @@rowcount =  0  break
end

работает гораздо быстрее соответствующего курсора
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как в динамический запрос запихнуть переменную? / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]