Почему SQL Server не отображает sys.columns.object_id должным образом? - PullRequest
0 голосов
/ 03 апреля 2019

, когда я только извлекаю sys.columns.object_id из sys.columns, отображается следующий результат:

select top 5 sys.columns.object_id as columns_object_id from sys.columns

columns_object_id
-----------
3
3
3
3
3

, но когда я получаю тот же столбец sys.columns.object_id после объединения с sys.tables.object_id, он отображает следующий результат:

SELECT top 5 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

column_Object_id Table_Object_id
---------------- ---------------
114099447        114099447
114099447        114099447
114099447        114099447
114099447        114099447
114099447        114099447

Теперь я хочу знать, почему columns.Object_id не отображается так же, как в запросе на соединение?

1 Ответ

1 голос
/ 05 апреля 2019

Здесь происходит несколько вещей.

Во-первых, 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
...