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 бита, а не с нулевого. Чаще всего в младших четырёх битах нули.