Мы не поняли друг друга в вопросе INFORMATION_SCHEMA-profiler.Я предлагал включить профилировщик, потому что SSMS выполняет SELECT для INFORMATION_SCHEMA с некоторыми предложениями where.Я подозреваю, что сам запрос отсекает ваши взгляды.Как только у вас появится запрос, который SSMS выполняет для получения списка объектов, вы должны выяснить, почему он не видит некоторые представления.
Вот сценарии, которые SSMS выполняет, когда вы выбираете все представления и запускаете сценарии.Проверьте, не возвращает ли какой-либо из них представление DivisionInfo.(Я создал представление DivisionInfo в моей базе данных, чтобы воспроизвести ваш случай).Для быстрой проверки выполните их один за другим и читайте мои комментарии после каждого запроса. Обратите внимание, что на самом деле вы должны перехватывать запросы в вашей среде с помощью Profiler, поскольку они могут отличаться в вашей среде.
Перед отображением экрана выбора видов, процедур, ... SSMS выполняет следующий скриптчтобы получить список просмотров:
exec sp_executesql N'SELECT
''Server[@Name='' + quotename(CAST(
serverproperty(N''Servername'')
AS sysname),'''''''') + '']'' + ''/Database[@Name='' + quotename(db_name(),'''''''') + '']'' + ''/View[@Name='' + quotename(v.name,'''''''') + '' and @Schema='' + quotename(SCHEMA_NAME(v.schema_id),'''''''') + '']'' AS [Urn],
v.name AS [Name],
SCHEMA_NAME(v.schema_id) AS [Schema]
FROM
sys.all_views AS v
WHERE
(v.type = @_msparam_0)and(CAST(
case
when v.is_ms_shipped = 1 then 1
when (
select
major_id
from
sys.extended_properties
where
major_id = v.object_id and
minor_id = 0 and
class = 1 and
name = N''microsoft_database_tools_support'')
is not null then 1
else 0
end
AS bit)=0)
ORDER BY
[Schema] ASC,[Name] ASC',N'@_msparam_0 nvarchar(4000)',@_msparam_0=N'V'
Ваш вид в списке?Вы можете добавить условие WHERE v.name = 'DivisionInfo'
, чтобы отфильтровать его.Если в списке нет DivisionInfo, проверьте, какая часть этого запроса исключает его из набора результатов.
После выбора объектов для сценария и запуска сценариев SSMS создает временную таблицу, хранит в ней объекты и выполняет сценарии для поиска связанных объектов..
Создать временную таблицу и вставить в нее представление DivisionInfo:
CREATE TABLE #tempdep (objid int NOT NULL, имя_объекта sysname NOT NULL, имя_объекта sysname NULL, имя_объекта sysname NOT NULL, объектный тип smallint NOTNULL)
exec sp_executesql N'INSERT INTO #tempdep
SELECT
v.object_id AS [ID],
v.name AS [Name],
SCHEMA_NAME(v.schema_id) AS [Schema],
db_name(),
2
FROM
sys.all_views AS v
WHERE
(v.type = @_msparam_0)and(v.name=@_msparam_1 and SCHEMA_NAME(v.schema_id)=@_msparam_2)',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000),@_msparam_2 nvarchar(4000)',@_msparam_0=N'V',@_msparam_1=N'DivisionInfo',@_msparam_2=N'dbo'
Вставил ли этот запрос что-нибудь в #tempdep?Если нет, проверьте почему. Еще раз: вам нужно использовать Profiler для получения запросов из вашей среды, а не использовать запросы, которые я здесь размещаю, потому что они из моей среды.
Когда вы начинаете профилирование, должно быть много вставоккак тот, что выше.Вам нужно найти тот, который относится к DivisionInfo.Вы можете использовать опцию Find, чтобы найти его, потому что вы увидите много запросов в Profiler, потому что у вас есть много других просмотров.Чтобы сделать журнал профилировщика меньшим, нужно только просмотреть сценарии.
Как видите, идея состоит в том, чтобы начать профилирование и запустить сценарии.После завершения сценариев остановите профилировщик и проверьте сценарии, выполняемые SSMS.Вы должны выяснить, почему он не видит DivisionInfo.Если в журнале профилировщика нет DivisionInfo, но вы можете проверить его на наличие сценариев в мастере, тогда возьмите сценарии для DivisionInfo и для одного представления, для которого работает сценарий, и просмотрите различия между ними.Внимательно рассмотрите различия между ними в отношении сценариев, которые SMSS использует для их извлечения.
- по какой-то причине SSMS отклоняет это представление
- в соответствии с данными, извлеченными с помощью запросов (catchedот профилировщика)