Из документов Oracle
Псевдоколонка ROWID
Для каждой строки в базе данных псевдостолбец ROWID возвращает
адрес строки. В значениях строк базы данных Oracle содержится информация
необходимо найти строку:
- Номер объекта данных объекта
- Блок данных в файле данных, в котором находится строка
- Положение строки в блоке данных (первая строка 0)
- Файл данных, в котором находится строка (первый файл - 1). Файл
число относительно табличного пространства.
Ближайшим эквивалентом этого в SQL Server является rid
, который состоит из трех компонентов File:Page:Slot
.
В SQL Server 2008 можно использовать недокументированный и неподдерживаемый виртуальный столбец %%physloc%%
, чтобы увидеть это. Это возвращает значение binary(8)
с идентификатором страницы в первых четырех байтах, затем 2 байта для идентификатора файла, а затем 2 байта для расположения слота на странице.
Скалярная функция sys.fn_PhysLocFormatter
или sys.fn_PhysLocCracker
TVF может использоваться для преобразования ее в более читаемую форму
CREATE TABLE T(X INT);
INSERT INTO T VALUES(1),(2)
SELECT %%physloc%% AS [%%physloc%%],
sys.fn_PhysLocFormatter(%%physloc%%) AS [File:Page:Slot]
FROM T
Пример вывода
+--------------------+----------------+
| %%physloc%% | File:Page:Slot |
+--------------------+----------------+
| 0x2926020001000000 | (1:140841:0) |
| 0x2926020001000100 | (1:140841:1) |
+--------------------+----------------+
Обратите внимание, что это не используется обработчиком запросов. Хотя возможно использовать это в WHERE
предложении
SELECT *
FROM T
WHERE %%physloc%% = 0x2926020001000100
SQL Server не будет напрямую искать указанную строку. Вместо этого он выполнит полное сканирование таблицы, оценит %%physloc%%
для каждой строки и вернет ту, которая соответствует (если есть).
Чтобы отменить процесс, выполняемый двумя ранее упомянутыми функциями, и получить значение binary(8)
, соответствующее известным значениям File, Page, Slot, ниже могут использоваться следующие значения.
DECLARE @FileId int = 1,
@PageId int = 338,
@Slot int = 3
SELECT CAST(REVERSE(CAST(@PageId AS BINARY(4))) AS BINARY(4)) +
CAST(REVERSE(CAST(@FileId AS BINARY(2))) AS BINARY(2)) +
CAST(REVERSE(CAST(@Slot AS BINARY(2))) AS BINARY(2))