Один из минусов того, что я больше не в команде SQL в Microsoft, — я не знаю обо всех недокументированных возможностях следующего релиза и, как и все, вынужден их выискивать :-(
Итак, ковыряясь в SSMS в 2008 CTP‑6, я заметил функцию под названием sys.fn_PhysLocCracker, о которой никогда не слышал. Выполнив sp_helptext для неё, получил такой вывод:
— Name: sys.fn_PhysLocCracker
—
— Description:
— Cracks the output of %%physloc%% virtual column
—
— Notes:
——————————————————————————-
create function sys.fn_PhysLocCracker (@physical_locator binary (8))
returns @dumploc_table table
(
[file_id] int not null,
[page_id] int not null,
[slot_id] int not null
)
as
begin
declare @page_id binary (4)
declare @file_id binary (2)
declare @slot_id binary (2)
— Page ID is the first four bytes, then 2 bytes of page ID, then 2 bytes of slot
—
select @page_id = convert (binary (4), reverse (substring (@physical_locator, 1, 4)))
select @file_id = convert (binary (2), reverse (substring (@physical_locator, 5, 2)))
select @slot_id = convert (binary (2), reverse (substring (@physical_locator, 7, 2)))
insert into @dumploc_table values (@file_id, @page_id, @slot_id)
return
end
Здорово — но есть кое‑что ещё, о чём я не слышал: %%physloc%%. Что это? Поигравшись немного, я разобрался, как это работает. Для полного замешательства есть ещё одна, идентичная, версия функции под именем sys.fn_PhysLocFormatter — и сработала у меня только она. Вот пример:
CREATE TABLE TEST (c1 INT IDENTITY, c2 CHAR (4000) DEFAULT ‘a’);
GO
INSERT INTO TEST DEFAULT VALUES;INSERT INTO TEST DEFAULT VALUES;INSERT INTO TEST DEFAULT VALUES;
GO
SELECT sys.fn_PhysLocFormatter (%%physloc%%) AS [Physical RID], * FROM TEST;
GO
Physical RID c1
—————— ———–
(1:411:0) 1
(1:411:1) 2
(1:413:0) 3
Это функция физического указателя записи! Недокументированная и не поддерживаемая (очевидно), но, что поделать, некоторые из лучших вещей именно такие :-) Она возвращает номер файла базы данных, страницу в файле и номер слота на странице в формате (file:page:slot). Я уже могу придумать массу применений, которые буду использовать.
Комментариев нет:
Отправить комментарий