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

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
14.03.2008, 11:45
    #35190393
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sybase ASE 12.5. Конструкции IF, приоритет операций...
Mikle83 пишет:
> Что это? В чем скрытый смысл?

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

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

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

З.Ы.: Просьба не обсуждать выбранный подход апгрейда таблиц, так как он был выбран не мною :) и не в моих силах пока его поменять...
...
Рейтинг: 0 / 0
17.03.2008, 16:43
    #35195946
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sybase ASE 12.5. Конструкции IF, приоритет операций...
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
17.03.2008, 16:57
    #35196007
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sybase ASE 12.5. Конструкции IF, приоритет операций...
Это понятно. Но при попытке выполнить такой запрос на базе выдается сообщение:

"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
17.03.2008, 16:59
    #35196023
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sybase ASE 12.5. Конструкции IF, приоритет операций...
Кстати,даже если в качестве условия поставить
if (1=2)
то все равно на него забивается...
...
Рейтинг: 0 / 0
17.03.2008, 17:19
    #35196092
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sybase ASE 12.5. Конструкции IF, приоритет операций...
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
17.03.2008, 17:26
    #35196115
SAV4SAV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sybase ASE 12.5. Конструкции IF, приоритет операций...
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
17.03.2008, 23:12
    #35196688
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sybase ASE 12.5. Конструкции IF, приоритет операций...
SAV4SAV пишет:

> select syb_quit()

Опередили, опередили !!
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
18.03.2008, 08:26
    #35196844
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sybase ASE 12.5. Конструкции IF, приоритет операций...
[/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
18.03.2008, 10:02
    #35196994
Сергей Васкецов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sybase ASE 12.5. Конструкции IF, приоритет операций...
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
18.03.2008, 10:17
    #35197034
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sybase ASE 12.5. Конструкции IF, приоритет операций...
Проблема в том, что выполнения скрипта на этом останавливается... А ведь после создания/не создания поля в таблице он должен выполнить еще кучу действий... Выносить в отдельный скрипт создание каждого поля? Как-то не рационально...
...
Рейтинг: 0 / 0
18.03.2008, 15:18
    #35198183
Сергей Васкецов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sybase ASE 12.5. Конструкции IF, приоритет операций...
Mikle83Проблема в том, что выполнения скрипта на этом останавливается
Не понял ни разу, что Вы имеете в виду.
Судя по "go", Вы это выполняете через isql (или через другой клиент, который понимает "go"). Если в скрипте будет ошибка, этот error просто надо сложить в отдельный файл с ошибками (см. параметры командной строки isql), чтобы потом можно было проанализировать. Прочие команды, которые идут через "go", выполнятся замечательно даже при ошибке. Только не надо добавлять несколько полей в рамках одного "go", то есть, надо делить скрипт операторами "go" на "атомарные" конструкции. А потом при анализе игнорировать ошибки типа "такое поле уже есть" или "нет полей для измения".
...
Рейтинг: 0 / 0
18.03.2008, 16:19
    #35198459
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sybase ASE 12.5. Конструкции IF, приоритет операций...
Странно.
У меня на каждое поле отдельная секция GO... Но при столкновении с ошибкой выполнение скрипта останавливается!
З.Ы.: Использую Advantage для выполнения скрипта...
...
Рейтинг: 0 / 0
18.03.2008, 16:43
    #35198550
Сергей Васкецов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sybase ASE 12.5. Конструкции IF, приоритет операций...
Mikle83Использую Advantage для выполнения скрипта...
Именно им не пользуюсь, так что может он и имеет какую-нибудь настройку на эту тему.
isql и DBArtisan после ошибок идут дальше (как я писал).
...
Рейтинг: 0 / 0
18.03.2008, 17:12
    #35198671
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sybase ASE 12.5. Конструкции IF, приоритет операций...
Сергей Васкецов Mikle83Использую Advantage для выполнения скрипта...
Именно им не пользуюсь, так что может он и имеет какую-нибудь настройку на эту тему.
isql и DBArtisan после ошибок идут дальше (как я писал).А вот в isql 15-ESD#10 появилась замечательная опция - --retserverror. Если ее дать в командой строке, то получив первую же ошибку от сервера, isql дальше не идет. Замечательная вещь для батников.
...
Рейтинг: 0 / 0
18.03.2008, 19:31
    #35199036
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sybase ASE 12.5. Конструкции IF, приоритет операций...
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
19.03.2008, 08:48
    #35199502
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sybase ASE 12.5. Конструкции IF, приоритет операций...
MasterZiv
Так это ж и есть результат работы syb_quit() !

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


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