Здесь происходит несколько вещей.
Во-первых, sys.tables
содержит информацию только о пользовательских таблицах. object_id
, который вы видите в своем первом запросе, является системной таблицей, поэтому она будет отфильтрована вашим объединением.
Кроме того, таблицы в SQL Server представляют собой неупорядоченные наборы данных, и TOP(n)
не имеет смысла без сопровождающего ORDER BY
. Так что это тоже часть этого.
Попробуйте эти варианты, чтобы понять, что я имею в виду. У меня, очевидно, есть другие пользовательские таблицы, чем у вас, поэтому результаты, которые я получаю, для вас не имеют смысла, но вы увидите разницу между ними в вашей системе:
SELECT --Returns 3 for me, too.
TOP 5
OBJECT_NAME(object_id)
,c.object_id as columns_object_id
FROM
sys.columns AS c;
SELECT --Returns the first user table's data.
TOP 5
OBJECT_NAME(c.object_id) AS ObjectName
,c.object_id as column_Object_id
,t.object_id as Table_Object_id
FROM
sys.columns AS c
JOIN
sys.tables AS t
ON
c.object_id = t.object_id;
А теперь попробуйте это, отметив ORDER BY
и LEFT JOIN
, поскольку искомая системная таблица отсутствует на столе sys.tables
:
SELECT
TOP 5
OBJECT_NAME(c.object_id) AS ObjectName
,c.object_id as column_Object_id
,t.object_id as Table_Object_id
FROM
sys.columns AS c
LEFT JOIN
sys.tables AS t
ON
c.object_id = t.object_id
ORDER BY c.object_id