Ответ 1
Это происходит потому, что sql-сервер и .net хранят int в другом формате. Это сделает трюк:
select cast(CONVERT(BINARY(16), REVERSE(CONVERT(BINARY(16), 1000))) as uniqueidentifier)
При преобразовании int в guid в С# и SQL Server я получаю разные значения.
В С# я использую этот метод
public static Guid Int2Guid( int value )
{
byte[] bytes = new byte[16];
BitConverter.GetBytes( value ).CopyTo( bytes, 0 );
return new Guid( bytes );
}
Console.Write( Int2Guid( 1000 ).ToString() );
// writes 000003e8-0000-0000-0000-000000000000
В SQL Server я использую
select cast(cast(1000 as varbinary(16)) as uniqueidentifier)
-- writes E8030000-0000-0000-0000-000000000000
Почему они ведут себя по-другому?
Это происходит потому, что sql-сервер и .net хранят int в другом формате. Это сделает трюк:
select cast(CONVERT(BINARY(16), REVERSE(CONVERT(BINARY(16), 1000))) as uniqueidentifier)
Байт в каждой группе в SQL Server "отменяется" для первых 8 байтов в каждой группе. Проверьте документацию на uniqueidentifier
http://technet.microsoft.com/en-us/library/aa223933(v=sql.80).aspx
В нем указано, что есть два способа предоставления значения - обратите внимание на порядок байтов:
Формат строки символов '6F9619FF-8B86-D011-B42D-00C04FC964FF
Двоичный формат 0xff19966f868b11d0b42d00c04fc964ff