2016-11-09 3 views
4

В Microsoft SQL Server 2014 (SP2-CU1) (KB3178925) - 12.0.5511.0 (X64) Aug 19 2016 14:32:30 Copyright (с) Microsoft Corporation Enterprise Edition (64-разрядная версия) на Windows, NT 6.1 (Build 7601: Service Pack 1) (гипервизор)Неверное возвращаемое значение OBJECT_ID?

с sp_updatestats на самом деле не существует, запрос:

SELECT OBJECT_ID('sp_UpdateStats') 

возвращает значение: -838816646

и

select * FROM sys.objects WHERE name='sp_UpdateStats' 

возвращение 0 линия ...

Как это может быть? Ошибка в функции OBJECT_ID?

EDIT

это хорошо знать, что ID -838816646 является пришедшим из sys.sysobjects или sys.system_objects, но тогда вопрос более точно есть:

  • почему процедура появится в sys.sysobjects и sys.system_objects, а не в sys.objects, который должен быть новым представлением, которое мы должны использовать?
+0

Из [fine manual] (https://msdn.microsoft.com/library/ms190324): «Существует версия этого представления с той же схемой, называемой« sys.system_objects », которая показывает системные объекты. Существует еще один вид, называемый 'sys.all_objects', который показывает как системные, так и пользовательские объекты. Все три представления каталога имеют одинаковую структуру». 'sp_updatestats' - системный объект. –

+1

У вас, похоже, создается впечатление, что 'sp_updatestats' не существует на вашем компьютере. Оно делает. Вы не могли отказаться от него, потому что невозможно удалить объекты системы, запретив использование ужасной черной магии. –

+0

«Почему процедура появляется в sys.sysobjects и sys.system_objects, а не в sys.objects, которая должна быть новым представлением, которое мы должны использовать?» Потому что Microsoft разработала его таким образом? Вы почти никогда не должны использовать запрос для системных объектов в первую очередь, поэтому они не помещали его в 'sys.objects', но вместо этого разделили представление на' sys.objects' только для пользовательских объектов и 'sys.system_objects' для системных объектов с 'sys.all_objects', если по какой-то причине вы действительно хотите * все * объекты. Это правда, что Books Online пренебрегает упоминанием об этом непосредственно под «картографическими системными таблицами». –

ответ

2

Она будет храниться в базе данных Mastersysobjects вид

select * FROM master.sys.sysobjects WHERE name='sp_UpdateStats' 

Результаты: -838816646

+0

Действительно, там есть sys.sysobjects ... Но я не понимаю, разве это не должно быть обесценено тем, что оно заменено на sys.objects? И почему он появляется в sys.sysobjects по мере удаления процедуры? это ошибка с этой старой таблицей обратной совместимости? – fasa

1

Использование sys.all_objects для включения объектов системы.

SELECT * 
FROM sys.all_objects 
WHERE NAME = 'sp_UpdateStats' 

Определение для этого действительно находится в базе данных ресурсов.

Смежные вопросы