правила формирования sysobjects.id

TUnknown
Дата: 13.09.2006 11:54:52
MSDE2KSP4 8.00.2039
Потребовалось получить порядок создания таблиц вне зависимости от их FK. sysobjects.crdate не подошёл, т.к. он может быть одинаков для таблиц создаваемых в одном батче. Даже есть подозрение, что таблица, идущая в батче позже может иметь меньший crdate, в пределах миллисекунд. В результате исследования получился такой скрипт. Похоже, что sysobjects.id состоит из 3 частей. Например,

id=2147187095
часть 0=3(младшие 4 бита символов слева)
часть 1=2147/0x863(символы слева)
часть 2=187095(6 символов справа)

строковое представление мешается с бинарным, части 1 и 2 возрастают в блоках, которые выделяются через часть 0, порядок следования которой выяснить пока не удалось.

begin tran

declare	@i	int,
	@max	int,
	@s	varchar ( 20 ),
	@sql	varchar ( 8000 )
----------
select	@max=	1000,
	@i=	0
----------
while	@i<	@max
begin
	select	@s=	convert ( varchar ( 20 ) , @i ),
		@sql=	'create	table q' + replicate ( '0' , len ( @max ) - len ( @s ) ) + @s + '( q int )'
----------
	exec	( @sql )
----------
	set	@i=	@i+	1
end
----------
select
	IdStr=	space ( 10-	len ( convert ( varchar ( 20 ) , id ) ) )+	convert ( varchar ( 20 ) , id ),
	Part1=	convert ( varbinary(20),convert ( int , left ( convert ( varchar ( 20 ) , id ) , len ( convert ( varchar ( 20 ) , id ) ) - 6 ) )),
	Part2=	convert ( int , right ( convert ( varchar ( 20 ) , id ) , 6 ) ),
	Part0=	convert ( int , left ( convert ( varchar ( 20 ) , id ) , len ( convert ( varchar ( 20 ) , id ) ) - 6 ) )&15,
	name,
	crdate
from
	sysobjects
where
		name	like	'q%'
	and	xtype=	'u'
order	by
	Part0

rollback tran


PS алгоритм получения правильного порядка пока выяснить не удалось

PPS Поле sysobjects.schema_ver тоже выглядит достаточно интересно. Ясно, что оно +1 при изменении таблицы, например alter или при создании FK на неё. Но +1 происходит начиная с младшего 5 бита, а не с нулевого. Чаще всего в младших четырёх битах нули.
GreenSunrise
Дата: 13.09.2006 12:18:31
На мой взгляд, самый простой и эффективный способ создания объектов в правильном порядке такой: имеем все скрипты для создания объектов, храним их ну в списке, к примеру. Проходим последовательно по списку, выполняя каждый скрипт. Вываливающиеся ошибки ловим и гасим. Если объект создался без ошибок, то из списка его выкидываем. И всю эту ботву - в цикл.

Соответственно, выход из цикла - если 0 объектов, то все были созданы. Если не ноль, но с предыдущего прохода количество объектов не уменьшилось, то опаньки. Значит, в скриптах ошибка и создать _все_ объекты нельзя.
TUnknown
Дата: 13.09.2006 12:25:36
TUnknown
Потребовалось получить порядок создания таблиц вне зависимости от их FK.
GreenSunrise
Дата: 13.09.2006 13:06:04
Ну и получайте. Создайте отдельную базу, прогоните на ней предложенный способ и запоминайте, какие объекты на каком проходе цикла были успешно созданы. Вот вам и порядок.

Всяко надежнее будет, чем опираться на правила формирования неких свойств, которые могут меняться от версии к версии.
TUnknown
Дата: 13.09.2006 13:18:35
TUnknown
Потребовалось получить порядок создания таблиц вне зависимости от их FK


Нужен порядок создания таблиц, а не порядок, создание в котором не вызовет ошибки.
TUnknown
Дата: 13.09.2006 15:16:58
прошу обратить внимание, особенно Crimean и jimmers