powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / DDL in script
16 сообщений из 16, страница 1 из 1
DDL in script
    #34831925
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
if not exists (select  1 
               from sysobjects
               where id = object_id('TableName')
               and type = 'U')
begin
 print 'No!!!'
 create table TableName (
 ...
 )
end
else
 print 'Yes!!!'
go
Когда второй раз бросаю на выполнение

Server Message: Number 2714, Severity 16
Server 'SERVERNAME', Line 7:
There is already an object named 'TableName' in the database.

хотя print 'No!!!' не выполняецццо... Получаецццо: это в момент компиляции еще до выполнения идет проверка на create table и что эта таблица уже существует и выдаецццо сообщение оп ашипке? зачем так? И почему тогда в
Код: plaintext
1.
2.
3.
4.
5.
6.
if exists (select  1 
            from  sysobjects
            where  id = object_id('SPName')
            and    type = 'P')
   drop procedure SPName
go
не ругаецццо если SPName отсутствует в БД? Ведь тогда, по аналогии, при компиляции нуна проверить на наличие отсутствия SPName в БД и при таковом - тоже ругнуццоо...
Или я где-то в чем-то неправ?..

P.S. select @@version
Adaptive Server Enterprise/12.5.1/EBF 11428/P/NT (IX86)/OS 4.0/ase1251/1823/32-bit/OPT/Wed Sep 17 11:10:54 2003


_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
DDL in script
    #34831987
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft пишет:
> Автор: "Ex_Soft"
>
> if not exists (select *1*
> from sysobjects
> where id = object_id(\'TableName\')
> and type = \'U\')
> begin
> print \'No!!!\'
> create table TableName (
> ...
> )
> хотя print \'No!!!\' не выполняецццо... Получаецццо: это в момент
> компиляции еще до выполнения идет проверка на create table и что эта
> таблица уже существует и выдаецццо сообщение оп ашипке? зачем так? И

Так уж повелось...
надо писать так :


if exists (select * from sysobjects where name = \'TableName\' and type = \'U\')
drop table TableName
go

create table TableName (
...
)
go

А твой скрипт вообще неправильный.
object_id(\'TableName\') будет null если таблицы нет.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
DDL in script
    #34832194
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Так уж повелось...
> надо писать так :
>
> if exists (select * from sysobjects where name = 'TableName' and type = 'U')
> drop table TableName
> go
>
> create table TableName (
> ...
> )
> go
Это - понятно... Но просто хотца нарисовать такой скрипт, который бы
содержал в себе весь жизненный цикл обЪекта БД. Т.е. от Рождества
Христова и до нынешних дней. И что бы не заморачиваться суппорту, а
просто тупо его накатывать. С view'хами && SP'шками - все просто:
drop'нул - создал. А, вот, с таблицами - засада: в них же данные. По
сему вариант с убиением оных - не прокатывает. Получаецццо нуна
создавать таблицу тока в одном случае: если ее - нЭт. А далее - просто
alter'ить ее...

> А твой скрипт вообще неправильный.
> object_id('TableName') будет null если таблицы нет.
гм... действительно... THNX подрихтую условие в if'е...
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
DDL in script
    #34850979
MichaelTim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv - а не подскажеш, как быть с времянкой тогда?
То есть задача примерно такая же. проверить в процедуре - если есть времянка - транкейт, если нету - создать.
В данном случае ведь не проканает select .. from tempdb..sysobjects. Так как име там будет не такое, да и баз темпдб несколько (хотя конечно можно определить текущую темпдб для сессии)
...
Рейтинг: 0 / 0
DDL in script
    #34851059
guest0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тоже напрягает. Пока так.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
if object_id('TestTable') is not null
begin
  declare @s varchar( 255 )
  select @s = 'Не пугайтесь. Сейчас отобразится следующеее сообщение, которое ошибкой не является!' + char( 13 ) + char( 10 ) + 
  'Соообщение:' + char( 13 ) + char( 10 ) +'"Msg 2714, Level 16, State 1:' + char( 13 ) + char( 10 ) + 
  'Server ' + db_name()  + ', Line 2:' + char( 13 ) + char( 10 ) + 
  'There is already an object named TestTable in the database."'
  print @s
end
go
if object_id('TestTable') is null
  create table TestTable(id int)
go
Если будут приставать тупые, которые читать не умеют, придётся передёргивать имена через sp_rename.
...
Рейтинг: 0 / 0
DDL in script
    #34851150
москит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MichaelTimMasterZiv - а не подскажеш, как быть с времянкой тогда?
То есть задача примерно такая же. проверить в процедуре - если есть времянка - транкейт, если нету - создать.
В данном случае ведь не проканает select .. from tempdb..sysobjects. Так как име там будет не такое, да и баз темпдб несколько (хотя конечно можно определить текущую темпдб для сессии)

Большой совет. Не связываться с созданием объектов в tempdb "по необходимости".
Есть более простые способы "вырыть себе могилу".

Я вот нарывался на следующее.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
select convert(varchar( 34 ), @@version)
go
if object_id('#TestTable') is null
  select 'object_id(''#TestTable'') is null (Таблицы еще нет)'
else
  select 'object_id(''#TestTable'') is not null (Таблица существует)'
go
create table #TestTable(id1 varchar( 30 ))
go
if object_id('#TestTable') is null
  select 'object_id(''#TestTable'') is null (Таблицы еще нет) 2'
else
  select 'object_id(''#TestTable'') is not null (Таблица существует) 2'
go
create proc Test2Proc
as
select * from #TestTable
return  0 
go
drop table #TestTable
go
create proc Test1Proc
as
if object_id('#TestTable') is null
create table #TestTable(id int)
insert #TestTable select  50 
exec Test2Proc
return  0 
go
create table #TestTable(id datetime)
insert #TestTable select '20070101'

select 'Отгадайте с 3-х раз какой результат вернётся!'
exec Test1Proc
go
select 'Отгадайте с 5-ти раз какой результат вернётся!'
exec Test2Proc
go

drop table #TestTable
go
drop proc Test1Proc
go
drop proc Test2Proc
go

РезультатAdaptive Server Enterprise/12.5.3/object_id('#TestTable') is null (Таблицы еще нет)object_id('#TestTable') is not null (Таблица существует) 2Отгадайте с 3-х раз какой результат вернётся!id50Отгадайте с 5-ти раз какой результат вернётся!id01.01.2007 0:00:00.000
...
Рейтинг: 0 / 0
DDL in script
    #34853432
MichaelTim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
москит - у меня ваш скрипт вообще вылетел с ошибкой.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select convert(varchar( 34 ), @@version)
go
if object_id('#TestTable') is null
  select 'object_id(''#TestTable'') is null (Таблицы еще нет)'
else
  select 'object_id(''#TestTable'') is not null (Таблица существует)'
go
create table #TestTable(id1 varchar( 30 ))
go
вот тут поле создаетеся id1. После исправления на id - скрипт отработал как и у вас.

Adaptive Server Enterprise/12.5.3/EBF 13339 ESD#7/P/x86_64/Enterprise Linux/ase1253/1951/64-bit/OPT/Fri Mar 24 00:39:11 2006

"Большой совет. Не связываться с созданием объектов в tempdb "по необходимости"."
Это в смысле вообще не использовать времянки? А как тогда?
Хотел проверять на их существование, так как у меня немало процедур запускается подряд, которым можно сделать одну времянку, а не создавать внутри каждой свою. Большое количество клиентов и нарывался на блокировки в tempdb..sysindexes.
...
Рейтинг: 0 / 0
DDL in script
    #34855573
москит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MichaelTimмоскит - у меня ваш скрипт вообще вылетел с ошибкой.

вот тут поле создаетеся id1. После исправления на id - скрипт отработал как и у вас.

Adaptive Server Enterprise/12.5.3/EBF 13339 ESD#7/P/x86_64/Enterprise Linux/ase1253/1951/64-bit/OPT/Fri Mar 24 00:39:11 2006

С id1 опечатка.
MichaelTim
"Большой совет. Не связываться с созданием объектов в tempdb "по необходимости"."
Это в смысле вообще не использовать времянки? А как тогда?

Использовать, только не пытаемся create под if поставить. Не проверяем есть таблица, или нет, сразу пишем create. Либо объявляем, что процедура такая-то работает, только если перед её запуском создана временная таблица такая-то(не создаём, но используем), либо она не работает если создана таблица с таким-то именем, так как сама содержит create.
Хотя всё это не спасает нас от ошибки из моего примера. Две таблицы с "одинаковыми" именами по прежнему создать можно. Причина, object_id может не увидеть таблицы, потому что он ищет её не только по первым 12-ти символам и @@spid, но и @@nestlevel.
MichaelTim
Хотел проверять на их существование, так как у меня немало процедур запускается подряд, которым можно сделать одну времянку, а не создавать внутри каждой свою.

Создать таблицу перед вызовом первой из этих процедур, а в процедурах таблицы не создавать. Всё равно таблица созданная в процедуре, по окончании её выполнения сама дропнется, а значит в следующей процедуре её опять создавать заново.
MichaelTim
Большое количество клиентов и нарывался на блокировки в tempdb..sysindexes.
Самые часто используемые временные таблицы можно создать один раз при коннекте к базе. Злоупотреблять не стоит, можно получить конкуренцию при одновременном коннекте большого числа пользователей, например, при рестарте сервака.
...
Рейтинг: 0 / 0
DDL in script
    #34855576
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
москит пишет:

> Самые часто используемые временные таблицы можно создать один раз при
> коннекте к базе. Злоупотреблять не стоит, можно получить конкуренцию при
> одновременном коннекте большого числа пользователей, например, при
> рестарте сервака.

Самые частоиспользуемые временные таблицы можно сделать постоянными
псевдовременными в tempdb.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
DDL in script
    #34856408
MichaelTim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
Самые частоиспользуемые временные таблицы можно сделать постоянными
псевдовременными в tempdb.

А в чем смысл? хочется сделать чтобы таблицы были для каждого конекта своя - чтобы не было блокировок. Имхо временная таблица для этого лучше.
или я не прав? чем лучше/хуже псевдовременная в tempdb?
...
Рейтинг: 0 / 0
DDL in script
    #34856712
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MichaelTim пишет:

> А в чем смысл? хочется сделать чтобы таблицы были для каждого конекта
> своя - чтобы не было блокировок. Имхо временная таблица для этого лучше.
> или я не прав? чем лучше/хуже псевдовременная в tempdb?

Лучше - тем, что не надо создавать ее все время. Например, если это
надо делать в транзакции, это плохо, т.к. будет блокироваться
tempdb.sysobjects. Хуже - тем, что надо поддерживать разделение
по пользователям ручками.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
DDL in script
    #34856933
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Хуже - тем, что надо поддерживать разделение
по пользователям ручками.

фильтр по спидам
...
Рейтинг: 0 / 0
DDL in script
    #34859439
MichaelTim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да я в принципе до этого делал вариант с обычной таблицей в своей БД. естественно для разделения завел два поля spid и procid. Для разделения по пользователям и по процедурам (если понадобится).
Но посчитал что всеже создавать времянки получше будет. - никаких блокировок в смысле данных (так как у каждого своя таблица) ну т.д. Но тут возникли блокировки в tempdb..sysindexes.
Сейчас вот админы сделали 4-ре tempdb.
...
Рейтинг: 0 / 0
DDL in script
    #34861146
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MichaelTimда я в принципе до этого делал вариант с обычной таблицей в своей БД. естественно для разделения завел два поля spid и procid. Для разделения по пользователям и по процедурам (если понадобится).
Но посчитал что всеже создавать времянки получше будет. - никаких блокировок в смысле данных (так как у каждого своя таблица) ну т.д. Но тут возникли блокировки в tempdb..sysindexes.
Сейчас вот админы сделали 4-ре tempdb.
вам просто уменьшили в 4 раза вероятность драки за sysindexes
в случае постоянных временных таблиц максимум что у вас будет - драка за страницу данных/индекса; и то, на это можно влиять
...
Рейтинг: 0 / 0
DDL in script
    #34862204
MichaelTim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так чем в моем описании как было реалиовано будет отличаться использование постоянных времянок от просто постоянной таблицы?
С DOL.
...
Рейтинг: 0 / 0
DDL in script
    #34862674
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MichaelTimтак чем в моем описании как было реалиовано будет отличаться использование постоянных времянок от просто постоянной таблицы?
С DOL.
врЕменные данные должны лежать во врЕменной БД ;)
её проще перенастроить при проблемах с производительностью - раскидать по разным девайсам, каналам хранилища, положить в RAM и т.п.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / DDL in script
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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