Вот возможный метод с использованием курсора - я добавил ваш скрипт дословно на динамический sql, который запускается на каждой итерации курсора.
SET NOCOUNT ON;
DECLARE @GET_Databases CURSOR;
DECLARE
@Current_Database NVARCHAR(250)
,@SQL NVARCHAR(MAX)
,@Param_Declare NVARCHAR(500)
,@ErrorMsg NVARCHAR(MAX)
,@LoopCount INT
,@RowCount NVARCHAR(5);
SET @SQL = ''
SET @Param_Declare = N'@Err NVARCHAR(MAX) OUTPUT,@Rows VARCHAR(5) OUTPUT'
SET @LoopCount = 1
IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results;
CREATE TABLE #Results
(Id INT IDENTITY(1,1) NOT NULL
,DatabaseName NVARCHAR(250) NOT NULL
,trigger_name NVARCHAR(250) NOT NULL
,trigger_owner NVARCHAR(250) NOT NULL
,table_schema NVARCHAR(50) NOT NULL
,table_name NVARCHAR(250) NOT NULL
,isupdate INT NOT NULL
,isdelete INT NOT NULL
,isinsert INT NOT NULL
,isafter INT NOT NULL
,isinsteadof INT NOT NULL
,[disabled] INT NOT NULL
,Error NVARCHAR(MAX) NULL
);
SET @GET_Databases = CURSOR FOR
SELECT name
FROM sys.databases
ORDER BY name;
OPEN @GET_Databases;
FETCH NEXT FROM @GET_Databases INTO @Current_Database;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = '';
SET @SQL = @SQL +
----------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------
'USE ' + QUOTENAME(@Current_Database) + ';
';
----------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------
SET @SQL = @SQL + '
BEGIN TRY
';
SET @SQL = @SQL +
----------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------
'INSERT #Results (DatabaseName, trigger_name, trigger_owner, table_schema, table_name, isupdate, isdelete, isinsert, isafter, isinsteadof, disabled)
SELECT
''' + @Current_Database + ''',
sysobjects.name AS trigger_name,
USER_NAME(sysobjects.uid) AS trigger_owner,
s.name AS table_schema,
OBJECT_NAME(parent_obj) AS table_name,
OBJECTPROPERTY(id, ''ExecIsUpdateTrigger'') AS isupdate,
OBJECTPROPERTY(id, ''ExecIsDeleteTrigger'') AS isdelete,
OBJECTPROPERTY(id, ''ExecIsInsertTrigger'') AS isinsert,
OBJECTPROPERTY(id, ''ExecIsAfterTrigger'') AS isafter,
OBJECTPROPERTY(id, ''ExecIsInsteadOfTrigger'') AS isinsteadof,
OBJECTPROPERTY(id, ''ExecIsTriggerDisabled'') AS [disabled]
FROM
sysobjects
INNER JOIN
sysusers ON sysobjects.uid = sysusers.uid
INNER JOIN
sys.tables t ON sysobjects.parent_obj = t.object_id
INNER JOIN
sys.schemas s ON t.schema_id = s.schema_id
WHERE
sysobjects.type = ''TR''
AND OBJECT_NAME(parent_obj) IN (''accgrp'', ''portinfo'')'
----------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------
SET @SQL = @SQL + '
SET @Rows = CONVERT(NVARCHAR(5),@@ROWCOUNT)
END TRY
BEGIN CATCH
SET @Err = ERROR_MESSAGE();
END CATCH';
IF @LoopCount = 1
BEGIN
PRINT 'Example SQL Script:';
PRINT @SQL;
END
PRINT @Current_Database;
EXECUTE sp_executesql
@SQL
,@Param_Declare
,@Err = @ErrorMsg OUTPUT
,@Rows = @RowCount OUTPUT;
IF @ErrorMsg IS NOT NULL
BEGIN
PRINT @ErrorMsg + '
';
SET @ErrorMsg = NULL;
END
ELSE PRINT ' ' + @Rowcount + ' Rows
';
SET @LoopCount = @LoopCount + 1;
FETCH NEXT FROM @GET_Databases INTO @Current_Database;
END
CLOSE @GET_Databases;
DEALLOCATE @GET_Databases;
SET NOCOUNT OFF;
SELECT * FROM #Results
DROP TABLE #Results
Есть ли у вас внешняя причина, по которой вы не можете проходить через базы данных, или вы спрашиваете, как проходить через базы данных? Например, вы пробовали динамический SQL и указатель на таблицу sys.databases? –
@HighPlainsGrifter Нет, я не знаю, как написать. Я просто придумал этот sql –