Попробуйте следующее
DECLARE @command varchar(1000)
DECLARE @spName VARCHAR(50)
SET @spName = 'Support.CleanIndiciesAndShrinkDatabase'
SELECT @command = 'IF ''?'' NOT IN(''master'', ''model'', ''msdb'', ''tempdb'')
BEGIN
USE ?
IF EXISTS(SELECT TOP 1 1 FROM sys.procedures AS P WHERE p.name = ''' + @spName + ''')
BEGIN
PRINT ''running '+ @spName + ' on '' + DB_NAME()
EXEC ' +@spName+'
END
ELSE
BEGIN
PRINT ''' + @spName + ' was on found on database '' + DB_NAME()''
END
END '
EXEC sp_MSforeachdb @command
Он будет работать на всех несистемных базах данных.Теперь ошибка, которую вы получаете, означает, что SQL Server не может найти хранимую процедуру.Вы можете исправить это, создав хранимую процедуру в любой базе данных, которая еще не имеет ее, а затем запустив ее.Так что лучше запрос будет
DECLARE @command varchar(1000)
DECLARE @schemaName VARCHAR(50)
DECLARE @spName VARCHAR(50)
SET @schemaName = 'Support'
SET @spName = 'CleanIndiciesAndShrinkDatabase'
SELECT @command = 'IF ''?'' NOT IN(''master'', ''model'', ''msdb'', ''tempdb'')
BEGIN
USE ?
IF NOT EXISTS(SELECT TOP 1 1
FROM sys.procedures AS P
INNER JOIN sys.schemas AS S ON S.schema_id = P.schema_id
WHERE p.name = ''' + @spName + '''
AND s.name = ''' + @schemaName + ''')
BEGIN
PRINT ''creating '+ @spName + ' on '' + DB_NAME()
IF NOT EXISTS ( SELECT TOP 1 1
FROM sys.schemas AS S
WHERE S.name = ''' + @schemaName + ''' )
BEGIN
PRINT ''CREATING SCHEMA ' + @schemaName + '''
EXEC ( '' CREATE SCHEMA ' + @schemaName + ''' );
END;
EXEC ( ''
CREATE PROCEDURE ' + @schemaName + '.' + @spName + '
AS
BEGIN
-- SP CODE GOES HERE
-- SELECT COUNT(*) FROM SYS.TABLES --uncomment this for check
END
'' );
END
PRINT ''running '+ @spName + ' on '' + DB_NAME()
EXEC ' + @schemaName + '.' + @spName +'
END '
EXEC sp_MSforeachdb @command