Найдите объект в SQL Server (перекрестная база данных)

Ваши диапазоны не одинакового размера, и вы, вероятно, должны использовать SUMPRODUCT вместо COUNTIFS.

Если у вас есть строка заголовка в строке 1,

=SUMPRODUCT(--($A$2:$A$7="eggs"), --($B$2:$B$7>$C$2:$C$7))

Если нет строки заголовка и ваши данные начинаются в строке 1,

=SUMPRODUCT(--($A$1:$A$6="eggs"), --($B$1:$B$6>$C$1:$C$6))
21
задан John Saunders 6 April 2010 в 20:04
поделиться

5 ответов

Существует схема Information_Schema, которая представляет собой набор представлений таблиц из схемы SYS, которые вы можете запросить, чтобы получить желаемое.

Обратной стороной Information_Schema является то, что вам нужно написать один запрос для каждого типа объекта. Плюс в том, что Information_Schema более удобна для чтения.

Схема Sys поначалу может показаться немного загадочной, но она содержит ту же информацию в одном месте.

По сути, в каждой базе данных есть таблица с именем SysObjects, в которой есть имена всех объектов и их типы.

] Итак, вам нужно выполнить поиск в базе данных следующим образом:

Select [name] as ObjectName, Type as ObjectType
From Sys.Objects
Where 1=1
and [Name] like '%YourObjectName%'

Теперь, если вы хотите ограничить это поиском только таблиц и сохраненных процедур, вы бы сделали

Select [name] as ObjectName, Type as ObjectType
From Sys.Objects
Where 1=1
and [Name] like '%YourObjectName%'
and Type in ('U', 'P')

Если вы посмотрите типы объектов, вы найдете целый список представлений, триггеров и т. д.

Теперь, если вы хотите найти это в каждой базе данных, вам придется перебирать базы данных. Вы можете выполнить одно из следующих действий:

Если вы хотите выполнить поиск по каждой базе данных без каких-либо предложений, используйте процедуру sp_MSforeachdb, как показано в ответе здесь.

Если вы хотите выполнять поиск только в определенных базах данных, используйте команду «USE DBName ", а затем команду поиска.

В этом случае вы получите большую выгоду от ее параметризации. Обратите внимание, что имя базы данных, в которой вы выполняете поиск, необходимо будет заменить в каждом запросе (DatabaseOne, DatabaseTwo ...). Проверьте это:

Declare @ObjectName VarChar (100)

Set @ObjectName = '%Customer%'

Select 'DatabaseOne' as DatabaseName, [name] as ObjectName, Type as ObjectType
From DatabaseOne.Sys.Objects
Where 1=1
and [Name] like @ObjectName
and Type in ('U', 'P')
UNION ALL
Select 'DatabaseTwo' as DatabaseName, [name] as ObjectName, Type as ObjectType
From DatabaseTwo.Sys.Objects
Where 1=1
and [Name] like @ObjectName
and Type in ('U', 'P')
UNION ALL
Select 'DatabaseThree' as DatabaseName, [name] as ObjectName, Type as ObjectType
From DatabaseThree.Sys.Objects
Where 1=1
and [Name] like @ObjectName
and Type in ('U', 'P')
35
ответ дан 29 November 2019 в 19:59
поделиться

select db_name(), * From sysobjects where xtype in ('U', 'P') And name = 'OBJECT_name'

столбец First отобразит имя базы данных, где объект расположен в.

0
ответ дан 29 November 2019 в 19:59
поделиться
sp_MSforeachdb 'select db_name(), * From ?..sysobjects where xtype in (''U'', ''P'') And name = ''ObjectName'''

Вместо «ObjectName» вставьте объект, который вы ищете. В первом столбце будет отображаться имя базы данных, в которой расположен объект.

11
ответ дан 29 November 2019 в 19:59
поделиться

Самый простой способ - открыть information_schemas ...

SELECT *
FROM information_schema.Tables
WHERE [Table_Name]='????'

SELECT *
FROM information_schema.Views
WHERE [Table_Name]='????'

SELECT *
FROM information_schema.Routines
WHERE [Routine_Name]='????'
4
ответ дан 29 November 2019 в 19:59
поделиться

Процедуру sp_MSforeachdb можно использовать для поиска во всех базах данных.

объявить @RETURN_VALUE int

declare @ command1 nvarchar (2000)

set @ command1 = "Здесь идет ваша команда"

exec @RETURN_VALUE = sp_MSforeachdb @ command1 = @ command1

Raj

1
ответ дан 29 November 2019 в 19:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: