powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как в динамический запрос запихнуть переменную?
17 сообщений из 17, страница 1 из 1
Как в динамический запрос запихнуть переменную?
    #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
Как в динамический запрос запихнуть переменную?
    #32065438
fima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В динамический запрос надо передавать не названия переменных, а значения переменных
...
Рейтинг: 0 / 0
Как в динамический запрос запихнуть переменную?
    #32065442
Uriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2>fima
Я это прекрасно понимаю, но как это сделать в моем примере???
...
Рейтинг: 0 / 0
Как в динамический запрос запихнуть переменную?
    #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
Как в динамический запрос запихнуть переменную?
    #32065456
Uriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2>fima

Но мне нужно передать значение переменной @1 которая равна 5, а не значение переменной @i которая равна 1???
...
Рейтинг: 0 / 0
Как в динамический запрос запихнуть переменную?
    #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
Как в динамический запрос запихнуть переменную?
    #32065490
Uriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2>fima
Дело в том что я привел пример с 30 переменными, а на самом деле их гораздо больше, к тому же после вызова процедуры выполняются другие операции с данными которые возвращает функция - поэтому то я и хочу попробовать записать вызов процедуры в одну строку, а не писать сто одинаковых строк.
Но за поддержание диалога спасибо!!!
...
Рейтинг: 0 / 0
Как в динамический запрос запихнуть переменную?
    #32065492
fima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну тогда записывайте значения не в переменные а в таблицу, и ходите по ней...
...
Рейтинг: 0 / 0
Как в динамический запрос запихнуть переменную?
    #32065512
Uriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело в том, что данные в переменные попадают из курсора, а способа вставить из курсора данные прямо во временную таблицу без использования переменных я не нашел. Может знаешь другие варианты???
...
Рейтинг: 0 / 0
Как в динамический запрос запихнуть переменную?
    #32065542
fima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из курсора не знаю, но можно поробовать без курсора.
...
Рейтинг: 0 / 0
Как в динамический запрос запихнуть переменную?
    #32065551
Uriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каким образом???
...
Рейтинг: 0 / 0
Как в динамический запрос запихнуть переменную?
    #32065558
fima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
понятия не имею, я ж Вашу задачу не знаю, я пока обхожусь без курсоров. Может и у Вас можно без него, а может нельзя.
...
Рейтинг: 0 / 0
Как в динамический запрос запихнуть переменную?
    #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
Как в динамический запрос запихнуть переменную?
    #32065617
Фотография Gobzo Kobler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В консерватории что-то подправить надо. У вас ошибка дизайна и надо не сражаться с 30 переменными, а изменить подход. Советую привести более подробное описание задачи и в 99% случаев, я уверен, удастся обойтись JOIN.
Курсоров вообще следует избегать как бешеных собак.
...
Рейтинг: 0 / 0
Как в динамический запрос запихнуть переменную?
    #32065680
Uriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курсоров вообще следует избегать как бешеных собак.

2>Gobzo Kobler
Может пояснишь почему???
...
Рейтинг: 0 / 0
Как в динамический запрос запихнуть переменную?
    #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
Как в динамический запрос запихнуть переменную?
    #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
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как в динамический запрос запихнуть переменную?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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