Этот курсор можно использовать для поиска определений объектов (триггеров, функций, хранимых процедур и т. Д.) Во всех базах данных текущего подключенного экземпляра.
DECLARE @SearchString VARCHAR(100) = 'sax2012r2_prod'
IF OBJECT_ID('tempdb..#FoundProceses') IS NOT NULL
DROP TABLE #FoundProceses
CREATE TABLE #FoundProceses (
DatabaseName VARCHAR(1000),
SchemaName VARCHAR(1000),
ObjectType VARCHAR(1000),
ObjectName VARCHAR(1000),
CreatedDate DATETIME,
ModifiedDate DATETIME)
DECLARE @c_DatabaseName VARCHAR(100)
DECLARE databaseCursor CURSOR FOR
SELECT D.Name FROM master.sys.databases AS D WHERE D.database_id > 4 ORDER BY D.Name
OPEN databaseCursor
FETCH NEXT FROM databaseCursor INTO @c_DatabaseName
DECLARE @v_DynamicSQLInsert VARCHAR(MAX)
WHILE @@FETCH_STATUS = 0
BEGIN
SET @v_DynamicSQLInsert = '
USE ' + @c_DatabaseName + '
INSERT INTO #FoundProceses (
DatabaseName,
ObjectType,
SchemaName,
ObjectName,
CreatedDate,
ModifiedDate)
SELECT
DatabaseName = ''' + @c_DatabaseName + ''',
ObjectType = O.type_desc,
SchemaName = SCHEMA_NAME(O.[schema_id]),
ObjectName = O.name,
CreatedDate = O.create_date,
ModifiedDate = O.modify_date
FROM
' + QUOTENAME(@c_DatabaseName) + '.sys.objects AS O
WHERE
OBJECT_DEFINITION(O.object_id) LIKE ''%' + @SearchString + '%'' AND
O.type IN (''P'', ''IF'', ''FN'', ''TF'', ''PC'', ''TR'', ''V'')'
EXEC (@v_DynamicSQLInsert)
FETCH NEXT FROM databaseCursor INTO @c_DatabaseName
END
CLOSE databaseCursor
DEALLOCATE databaseCursor
SELECT
F.DatabaseName,
F.SchemaName,
F.ObjectType,
F.ObjectName,
F.CreatedDate,
F.ModifiedDate
FROM
#FoundProceses AS F
ORDER BY
F.DatabaseName,
F.SchemaName,
F.ObjectType,
F.ObjectName
Он запрашивает результат OBJECT_DEFINITION()
функция на каждом объекте от sys.objects
.