powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Sybase ASE 12.5. Конструкции IF, приоритет операций...
22 сообщений из 22, страница 1 из 1
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35189915
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Столкнулся со странной вещью. ВЫполняем вот такой запрос:

Create Table #Groups
(ID integer,
Name varchar(10),
Process int
)
go
if (1=2)
begin
print 'Alter table Groups add column "Process"'
Alter table #Groups add Process int default 1
end
go

и Sybase плавно забивает на условие (1=2) и пытается создать колонку...
При этом print не выполнется...
Еще интересный момент если Alter такой:
Alter table #Groups add Process int NULL
то все отрабатывает корректно...

Что это? В чем скрытый смысл?
...
Рейтинг: 0 / 0
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35190393
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikle83 пишет:
> Что это? В чем скрытый смысл?

Все комманды DDL должны быть ОТДЕЛЬНЫМ БАТЧЕМ
(если это происходит не в процедуре).
Кроме того, вы видимо не понимаете, как компилируются,
валидируются и выполняются запросы, и отсюда - недоумение.
Даже если запрос НЕ ВЫПОЛНЯЕТСЯ ВООБЩЕ, он перед этим
валидируется целиком, даже невыполняющиеся части.
Это значит, что разрешаются имена объектов,
полей и т.п. В частности, валидируется на правильность
и DDL.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35190458
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Mikle83 пишет:
> Что это? В чем скрытый смысл?

Все комманды DDL должны быть ОТДЕЛЬНЫМ БАТЧЕМ
(если это происходит не в процедуре).
Кроме того, вы видимо не понимаете, как компилируются,
валидируются и выполняются запросы, и отсюда - недоумение.
Даже если запрос НЕ ВЫПОЛНЯЕТСЯ ВООБЩЕ, он перед этим
валидируется целиком, даже невыполняющиеся части.
Это значит, что разрешаются имена объектов,
полей и т.п. В частности, валидируется на правильность
и DDL.
Posted via ActualForum NNTP Server 1.4

Тогда может быть вы мне объясните разницу между
Alter table #Groups add Process int default 1
и
Alter table #Groups add Process int NULL
???
Почему во втором случае валидируется (или как там), вообщем на условие обращается внимание, а в первом на условие забивается?

P.S.: MS SQL SERVER 2000 отрабатывает корректно в обоих случаях...
...
Рейтинг: 0 / 0
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35195576
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ!!! Подскажите какой-нить профильный форум по Sybase, плиз... можно ли как-то получить ответ у разработчиков на данный вопрос? ибо очень сильно надо решить возникшую проблему...
...
Рейтинг: 0 / 0
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35195619
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikle83 пишет:
> Народ!!! Подскажите какой-нить профильный форум по Sybase, плиз... можно
> ли как-то получить ответ у разработчиков на данный вопрос? ибо очень
> сильно надо решить возникшую проблему...

Я же тебе объяснил. Любой DDL ДОЛЖЕН быть отдельным батчем.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35195767
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда как решить такую задачу:
дистанционно необходимо проапгрейдить таблицу на БД клиента... Апгрейд заключается в добавлении колонки Process типа bit, not null, Defualt = 1.
Ситуация такова, что в таблице уже может быть такая колонка... Поэтому необходимо предварительно сделать проверку на существование, и если уже существует, то не создаем колонку...

Как сие можно реализовать... На MS SQL все разводилось через If в скрипте, здесь же это не прокатывает...

З.Ы.: Просьба не обсуждать выбранный подход апгрейда таблиц, так как он был выбран не мною :) и не в моих силах пока его поменять...
...
Рейтинг: 0 / 0
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35195946
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikle83Тогда как решить такую задачу:
дистанционно необходимо проапгрейдить таблицу на БД клиента... Апгрейд заключается в добавлении колонки Process типа bit, not null, Defualt = 1.
Ситуация такова, что в таблице уже может быть такая колонка... Поэтому необходимо предварительно сделать проверку на существование, и если уже существует, то не создаем колонку...

Как сие можно реализовать... На MS SQL все разводилось через If в скрипте, здесь же это не прокатывает...Все прокатывает. Надо только правильно писать.

Код: plaintext
1.
2.
3.
4.
5.
6.
use mydb
go

if not exists (select * from sysobjects o join syscolumns c on c.id=o.id
                  where o.name='table_name' and c.name='column_name')
      alter table table_name add column_name int default  1 
go

Mikle83З.Ы.: Просьба не обсуждать выбранный подход апгрейда таблиц, так как он был выбран не мною :) и не в моих силах пока его поменять...А чего его обсуждать? Правильный подход. Осталось только научиться его правильно применять...
...
Рейтинг: 0 / 0
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35196007
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это понятно. Но при попытке выполнить такой запрос на базе выдается сообщение:

"Column names in each table must be unique. Column name 'Process' in table 'Groups' is specified more than once."

Причем, если используем
alter table Groups add Process int null

тогда все нормально работает... Вот в чем загадка...
...
Рейтинг: 0 / 0
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35196023
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати,даже если в качестве условия поставить
if (1=2)
то все равно на него забивается...
...
Рейтинг: 0 / 0
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35196092
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikle83Это понятно. Но при попытке выполнить такой запрос на базе выдается сообщение:
"Column names in each table must be unique. Column name 'Process' in table 'Groups' is specified more than once."А ну да, это ж ASE... Это в SA все работает и без извращений, а на ASE надо писать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
use mydb
go

if not exists (select * from sysobjects o join syscolumns c on c.id=o.id
                  where o.name='table_name' and c.name='column_name')
      execute ('alter table table_name add column_name int default 1')
go
Тогда ASE не будет делать проверку существует ли уже колонка которую ты будешь добавлять в alter table или не существует.

Mikle83Причем, если используем
alter table Groups add Process int null
тогда все нормально работает... Вот в чем загадка...ээээ... тут не уверен. Это какие-то странности в парсере sql. Если есть слово default, то парсер ведет себя более жестко чем без него.
...
Рейтинг: 0 / 0
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35196115
SAV4SAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikle83Тогда как решить такую задачу:
дистанционно необходимо проапгрейдить таблицу на БД клиента... Апгрейд заключается в добавлении колонки Process типа bit, not null, Defualt = 1.
Ситуация такова, что в таблице уже может быть такая колонка... Поэтому необходимо предварительно сделать проверку на существование, и если уже существует, то не создаем колонку...
Можно так, к примеру -
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
use master
go
if exists 
	(select * from sysobjects o join syscolumns c on c.id=o.id
				    join sysusers u on o.uid = u.uid
             where o.name='syslogins' and c.name='suid'
	           and u.name = 'dbo')
begin
	print ">> Error. Column 'suid' exists<<"
	select syb_quit()
end 
go
Т.е., если поле есть, выйти и ничего не делать
...
Рейтинг: 0 / 0
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35196688
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAV4SAV пишет:

> select syb_quit()

Опередили, опередили !!
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35196844
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[/quot]ээээ... тут не уверен. Это какие-то странности в парсере sql. Если есть слово default, то парсер ведет себя более жестко чем без него.[/quot]

Вот и я про тоже... Причем уже с несколькими подобными странностями я сталкивался... Немного напрягает непредсказуемость ASE...

Спасибо за совет!!! Вариант с execute - как раз то, что нужно - прокатывает отлично.

А вот с выходом select syb_quit()
не идет :( Ругается: "Failure has occurred in CT-Library call. Connection is no longer usable and will be automatically dropped."
Возможно настройки сервака надо крутить?
...
Рейтинг: 0 / 0
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35196994
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikle83А вот с выходом select syb_quit()
не идет :( Ругается: "Failure has occurred in CT-Library call. Connection is no longer usable and will be automatically dropped."
Возможно настройки сервака надо крутить?
Это стандартное поведение syb_quit(), "крутить" нечего.

А что плохого в том, что возникнет ошибка при повторном выполнении alter, ничего ведь не произойдет. Или проблема в клиенте (в смысле, в клиентской программе), который не умеет игнорировать подобные ошибки?
...
Рейтинг: 0 / 0
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35197034
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема в том, что выполнения скрипта на этом останавливается... А ведь после создания/не создания поля в таблице он должен выполнить еще кучу действий... Выносить в отдельный скрипт создание каждого поля? Как-то не рационально...
...
Рейтинг: 0 / 0
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35198183
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikle83Проблема в том, что выполнения скрипта на этом останавливается
Не понял ни разу, что Вы имеете в виду.
Судя по "go", Вы это выполняете через isql (или через другой клиент, который понимает "go"). Если в скрипте будет ошибка, этот error просто надо сложить в отдельный файл с ошибками (см. параметры командной строки isql), чтобы потом можно было проанализировать. Прочие команды, которые идут через "go", выполнятся замечательно даже при ошибке. Только не надо добавлять несколько полей в рамках одного "go", то есть, надо делить скрипт операторами "go" на "атомарные" конструкции. А потом при анализе игнорировать ошибки типа "такое поле уже есть" или "нет полей для измения".
...
Рейтинг: 0 / 0
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35198459
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно.
У меня на каждое поле отдельная секция GO... Но при столкновении с ошибкой выполнение скрипта останавливается!
З.Ы.: Использую Advantage для выполнения скрипта...
...
Рейтинг: 0 / 0
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35198550
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikle83Использую Advantage для выполнения скрипта...
Именно им не пользуюсь, так что может он и имеет какую-нибудь настройку на эту тему.
isql и DBArtisan после ошибок идут дальше (как я писал).
...
Рейтинг: 0 / 0
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35198671
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Васкецов Mikle83Использую Advantage для выполнения скрипта...
Именно им не пользуюсь, так что может он и имеет какую-нибудь настройку на эту тему.
isql и DBArtisan после ошибок идут дальше (как я писал).А вот в isql 15-ESD#10 появилась замечательная опция - --retserverror. Если ее дать в командой строке, то получив первую же ошибку от сервера, isql дальше не идет. Замечательная вещь для батников.
...
Рейтинг: 0 / 0
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35199036
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikle83 пишет:
> Автор: "Mikle83"
> [/quot]ээээ... тут не уверен. Это какие-то странности в парсере sql.
> Если есть слово default, то парсер ведет себя более жестко чем без
> него.[/quot]
>
> Вот и я про тоже... Причем уже с несколькими подобными странностями я
> сталкивался... Немного напрягает непредсказуемость ASE...
>
> Спасибо за совет!!! Вариант с execute - как раз то, что нужно -
> прокатывает отлично.
>
> А вот с выходом select syb_quit()
> не идет :( Ругается: "Failure has occurred in CT-Library call.
> Connection is no longer usable and will be automatically dropped."

Так это ж и есть результат работы syb_quit() !
FAQ смотри ... http://www.sql.ru/faq/faq_topic.aspx?fid=247
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35199502
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Так это ж и есть результат работы syb_quit() !

Эт я понимаю, но такой результат меня не устраивает :) Мне надо, чтобы выполнение скрипта продолжалось а не прекращалось при существовании поля...
...
Рейтинг: 0 / 0
Sybase ASE 12.5. Конструкции IF, приоритет операций...
    #35199634
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikle83Мне надо, чтобы выполнение скрипта продолжалось а не прекращалось при существовании поля...
ISQL Вас спасет, и даже обсуждать нечего.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Sybase ASE 12.5. Конструкции IF, приоритет операций...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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