powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Почему не отрабатывает execute()? ASE 12.5
16 сообщений из 16, страница 1 из 1
Почему не отрабатывает execute()? ASE 12.5
    #37095124
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеем таблицу
Код: plaintext
1.
2.
3.
4.
create table aaa (
	id                              int                              not null  ,
	ttt                             char( 120 )                        not null   
)
Пример 1.
Прикручиваем к ней триггер
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create trigger dbo.ins_aaa on dbo.aaa
for insert as
begin
    declare  @ff char( 200 )
    declare @f1 char( 10 ), @f2 char( 10 )
    declare @ff1 char( 10 ), @ff2 char( 10 )	
	select @ff1 = "id", @ff2 = "ttt"
	set @ff = "select @f1 = convert(char(10)," + @ff1 + "),  @f2  = " + @ff2 + " from inserted "
	print @ff
	exec(@ff)
	print @f1
	print @f2
end
Делаем вставку в таблицу
Код: plaintext
insert into aaa values( 7 ,"bbbb")
Не работает, в переменные @f1 и @f2 не присвоены значения. Заодно смотрим выполняемый текст (execute)

Пример 2.
Прикручиваем к ней триггер
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create trigger dbo.ins_aaa on dbo.aaa
for insert as
begin
       declare  @ff char( 200 )
       declare @f1 char( 10 ), @f2 char( 10 )
       declare @ff1 char( 10 ), @ff2 char( 10 )	
	select @ff1 = "id", @ff2 = "ttt"
	set @ff = "select @f1 = convert(char(10)," + @ff1 + "),  @f2  = " + @ff2 + " from inserted "
	print @ff
	select @f1 = convert(char( 10 ),id), @f2 = ttt from inserted 	
	print @f1
	print @f2
end
Делаем вставку в таблицу
Код: plaintext
insert into aaa values( 7 ,"bbbb")
Видим что все работает, в переменные @f1 и @f2 присвоены значения соответствующих полей. Хотя выполнен тот же самый текст, который был отправлен на execute в прошлом примере.


В чем загвоздка?
...
Рейтинг: 0 / 0
Почему не отрабатывает execute()? ASE 12.5
    #37095246
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати при инсерте в первом примере вылетает вот такое окно
http://www.radikal.ru][IMG] http://s52.radikal.ru/i136/1102/8a/a418f32c2d7a.jpg [/IMG]
...
Рейтинг: 0 / 0
Почему не отрабатывает execute()? ASE 12.5
    #37095386
SAV4SAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Imperous,

Мне кажется, так как -
> Dynamically executing Transact-SQL
>The contents of the string or char_variable options cannot reference local variables declared in the SQL batch or procedure.

Код: plaintext
 exec(@ff) 
переменные @f1 и @f2 будут не определены.
...
Рейтинг: 0 / 0
Почему не отрабатывает execute()? ASE 12.5
    #37095514
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAV4SAVImperous,

Мне кажется, так как -
> Dynamically executing Transact-SQL
>The contents of the string or char_variable options cannot reference local variables declared in the SQL batch or procedure.

Код: plaintext
 exec(@ff) 
переменные @f1 и @f2 будут не определены.
нет, вот пример, который работает, и он работает как в процедуре, так и сам по себе
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
begin
    declare  @ff char( 200 )
    declare @f1 char( 10 ), @f2 char( 10 )
    declare @ff1 char( 10 ), @ff2 char( 10 )	
	select @ff1 = "id", @ff2 = "ttt"
	set @ff = "select @f1 = convert(char(10)," + @ff1 + "),  @f2  = " + @ff2 + " from aaa where id=3 "
	print @ff
	exec(@ff)
	print @f1
	print @f2
end
...
Рейтинг: 0 / 0
Почему не отрабатывает execute()? ASE 12.5
    #37095576
SAV4SAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Imperous,

А у меня -

(1 row affected)
(1 row affected)
select @f1 = convert(char(10),id ), @f2 = ttt from aaa where
id=3

Msg 137, Level 15, State 1:
Server 'xxxx', Line 1:
Must declare variable '@f1'.
...
Рейтинг: 0 / 0
Почему не отрабатывает execute()? ASE 12.5
    #37095643
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAV4SAVImperous,

А у меня -

(1 row affected)
(1 row affected)
select @f1 = convert(char(10),id ), @f2 = ttt from aaa where
id=3

Msg 137, Level 15, State 1:
Server 'xxxx', Line 1:
Must declare variable '@f1'.

странно, вот мой результат:
в адвантаже
автор(1 row affected)
(1 row affected)
select @f1 = convert(char(10),id ), @f2 = ttt from aaa where id=3
(1 row affected)
3
aaaaaaa
в интерактив sql
авторselect @f1 = convert(char(10),id ), @f2 = ttt from aaa where id=3

3
aaaaaaa
Execution time: 0.016 seconds

естественно подрузамевается что таблице ааа есть такая одна строка с id=3 и ttt="aaaaaaa"
...
Рейтинг: 0 / 0
Почему не отрабатывает execute()? ASE 12.5
    #37095782
SAV4SAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Imperous,

Не верю :-)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare @a int,@b varchar( 20 )
set @a= 1 
set @b="select @a"
select @a
print @b
execute (@b)
go

Must declare variable '@a'.


чем это отличается от Вашего запроса?
...
Рейтинг: 0 / 0
Почему не отрабатывает execute()? ASE 12.5
    #37095911
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAV4SAVImperous,

Не верю :-)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare @a int,@b varchar( 20 )
set @a= 1 
set @b="select @a"
select @a
print @b
execute (@b)
go

Must declare variable '@a'.


чем это отличается от Вашего запроса?

надо вначале ставить begin и в конце end тогда будет работать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
begin
declare @a int,@b varchar( 20 )
set @a= 1 
set @b="select @a"
select @a
print @b
execute (@b)
end


автор-----------
1
select @a



-----------
1
Execution time: 0.016 seconds
...
Рейтинг: 0 / 0
Почему не отрабатывает execute()? ASE 12.5
    #37095932
SAV4SAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Imperous,

Сделай run.cmd
Код: plaintext
1.
set DSQUERY=server_name
isql -Uuser_name -itest.sql -otest.log
а рядом положи test.sql
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
begin
declare @a int,@b varchar( 20 )
set @a= 1 
set @b="select @a"
select @a
print @b
execute (@b)
end
go
выполни и посмотри test.log
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
( 1  row affected)
( 1  row affected)
             
 ----------- 
            1  

( 1  row affected)
select @a
Msg  137 , Level  15 , State  2 :
Server 'xxxx', Line  1 :
Must declare variable '@a'.
...
Рейтинг: 0 / 0
Почему не отрабатывает execute()? ASE 12.5
    #37095960
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще один интересный момент
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create trigger dbo.ins_aaa on dbo.aaa
for insert as
begin
    declare @ff char( 200 )
    declare @new1 char( 10 ), @new2 char( 10 )	
	exec("select @new1 = convert(char(10),id), @new2 = ttt from inserted")
	print @new1
	print @new2
end
вставляем
Код: plaintext
insert into aaa values( 14 ,"bbbbaaa")
выдает вот такое
http://radikal.ru/F/s15.radikal.ru/i189/1102/ab/74bd33f0ceed.jpg.html][IMG] http://s15.radikal.ru/i189/1102/ab/74bd33f0ceedt.jpg [/IMG]
...
Рейтинг: 0 / 0
Почему не отрабатывает execute()? ASE 12.5
    #37095961
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Почему не отрабатывает execute()? ASE 12.5
    #37095973
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAV4SAVImperous,

Сделай run.cmd
Код: plaintext
1.
set DSQUERY=server_name
isql -Uuser_name -itest.sql -otest.log
а рядом положи test.sql
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
begin
declare @a int,@b varchar( 20 )
set @a= 1 
set @b="select @a"
select @a
print @b
execute (@b)
end
go
выполни и посмотри test.log
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
( 1  row affected)
( 1  row affected)
             
 ----------- 
            1  

( 1  row affected)
select @a
Msg  137 , Level  15 , State  2 :
Server 'xxxx', Line  1 :
Must declare variable '@a'.


получилось такое
авторMsg 2401, Level 11, State 2:
Server 'sybase_ds':
Character set conversion is not available between client character set 'iso_1'
and server character set 'cp1251'.
No conversions will be done.
(1 row affected)
(1 row affected)

-----------
1

(1 row affected)
select @a

-----------
1

(1 row affected)
...
Рейтинг: 0 / 0
Почему не отрабатывает execute()? ASE 12.5
    #37096078
SAV4SAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Imperous,

Ну не знаю,
Adaptive Server Enterprise/12.5.3/EBF 13337 ESD#7/P/ia64/HP-UX B.11.23/ase1253/1951/64-bit/OPT/Fri Mar 24 00:47:27 2006
ведет себя так, как я и представляю.

При
declare @a int
exec("select @a")

select @a выполняется вне батча, вызвавшего execute(), и не
знает про локальные переменные, объявленные в этом батче.
Сервер отвечает
Must declare variable '@a'.
...
Рейтинг: 0 / 0
Почему не отрабатывает execute()? ASE 12.5
    #37096209
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAV4SAVImperous,

Ну не знаю,
Adaptive Server Enterprise/12.5.3/EBF 13337 ESD#7/P/ia64/HP-UX B.11.23/ase1253/1951/64-bit/OPT/Fri Mar 24 00:47:27 2006
ведет себя так, как я и представляю.

При
declare @a int
exec("select @a")

select @a выполняется вне батча, вызвавшего execute(), и не
знает про локальные переменные, объявленные в этом батче.
Сервер отвечает
Must declare variable '@a'.
а меня такая железяка
Adaptive Server Enterprise/12.5.4/EBF 16831 ESD#9.1/P/x86_64/Enterprise Linux/ase1254/2146/64-bit/OPT/Wed Apr 15 03:57:32 2009
...
Рейтинг: 0 / 0
Почему не отрабатывает execute()? ASE 12.5
    #37097167
SAV4SAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Imperous,

Да, на 12.5.4 exec() видит переменные http://www.sql.ru/forum/images/happy.gif
...
Рейтинг: 0 / 0
Почему не отрабатывает execute()? ASE 12.5
    #37097265
SAV4SAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Imperous,

А вот, если инсерт делать не в DBISQL, то сервер сообщает

10.02.19:251 208 <SQL> (19) inserted not found. Specify owner.objectname or use sp_help to check whether the object exists (sp_help may produce lots of output).

Динамик sql выполняется в отдельном батче и псевдотаблицы inserted не видит.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Почему не отрабатывает execute()? ASE 12.5
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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