Вы можете использовать системные представления, содержащиеся в information_schema
, для поиска в таблицах, представлениях и (в незашифрованном виде) хранимые процедуры с одним скриптом. Некоторое время назад я разработал такой сценарий, потому что мне нужно было искать имена полей повсюду в базе данных.
В приведенном ниже сценарии сначала перечислены таблицы / представления, содержащие имя столбца, который вы ищете, а затем исходный код хранимых процедур, в котором находится столбец. Он отображает результат в одной таблице, в которой различаются БАЗОВАЯ ТАБЛИЦА, ПРОСМОТР и ПРОЦЕДУРА, и (необязательно) исходный код во второй таблице:
DECLARE @SearchFor nvarchar(max)='%CustomerID%' -- search for this string
DECLARE @SearchSP bit = 1 -- 1=search in SPs as well
DECLARE @DisplaySPSource bit = 1 -- 1=display SP source code
-- tables
if (@SearchSP=1) begin
(
select '['+c.table_Schema+'].['+c.table_Name+'].['+c.column_name+']' [schema_object],
t.table_type
from information_schema.columns c
left join information_schema.Tables t on c.table_name=t.table_name
where column_name like @SearchFor
union
select '['+routine_Schema+'].['+routine_Name+']' [schema_object],
'PROCEDURE' as table_type from information_schema.routines
where routine_definition like @SearchFor
and routine_type='procedure'
)
order by table_type, schema_object
end else begin
select '['+c.table_Schema+'].['+c.table_Name+'].['+c.column_name+']' [schema_object],
t.table_type
from information_schema.columns c
left join information_schema.Tables t on c.table_name=t.table_name
where column_name like @SearchFor
order by c.table_Name, c.column_name
end
-- stored procedure (source listing)
if (@SearchSP=1) begin
if (@DisplaySPSource=1) begin
select '['+routine_Schema+'].['+routine_Name+']' [schema.sp], routine_definition
from information_schema.routines
where routine_definition like @SearchFor
and routine_type='procedure'
order by routine_name
end
end
Если вы запустите запрос, используйте вариант результата как текст - тогда вы можете использовать поиск, чтобы найти текст для поиска в наборе результатов (полезно для длинного исходного кода).
Обратите внимание, что вы можете установить @DisplaySPSource
на 0
, если вы просто хотите отображать имена SP, и если вы просто ищете таблицы / представления, но не для SP, вы можете установить @SearchSP
на 0
.
Пример результата (найдите CustomerID
в базе данных Northwind, результаты отображаются через LinqPad):
Обратите внимание, что я проверил этот сценарий с помощью тестового представления dbo.TestOrders
, и он обнаружил CustomerID
в этом представлении, хотя c.*
использовался в операторе SELECT
(указанная таблица Customers
содержит CustomerID
, и, следовательно, представление показывает это столбец).
Примечание для пользователей LinqPad: в C # вы можете использовать dc.ExecuteQueryDynamic(sqlQueryStr, new object[] {... parameters ...} ).Dump();
и иметь параметры как @p0
... @pn
внутри строки запроса. Затем вы можете написать статический класс расширения и сохранить его в разделе Мои расширения для использования в ваших запросах LinqPad. Контекст данных может быть передан из окна запроса как DataContextBase dc
через параметр, то есть public static void SearchDialog(this DataContextBase dc, string searchString = "%")
внутри общедоступного статического класса расширения (в LinqPad 6 это DataContext
). Затем вы можете переписать приведенный выше SQL-запрос как строку с параметрами и вызвать ее из контекста C #.
person
Matt
schedule
26.06.2017
sys.all_sql_modules
. В частности, столбец под названиемdefinition
- person gvee   schedule 23.10.2013