Я создал системную хранимую процедуру в базе данных Master
, которую можно запустить во всех базах данных. Я хочу, чтобы запустить его во всех базах данных сразу, вот что я использую:Выполнение процедуры во всех базах данных
use Master
GO
declare @sql nvarchar(1000)
SET @sql = 'USE [?]; EXEC [dbo].[sp_procedure]'
EXEC sp_MSforeachdb @sql
Проблема заключается в том - не все базы данных имеют иметь подобную таблицу и структуру столбца. Так что внутри процедура, я делаю это, прежде чем делать какие-либо расчеты:
if exists(select 1
from
INFORMATION_SCHEMA.TABLES b,
INFORMATION_SCHEMA.COLUMNS c
where
b.TABLE_TYPE = 'BASE TABLE'
and b.TABLE_NAME = 'tablename'
and c.TABLE_NAME = b.TABLE_NAME
and c.COLUMN_NAME = 'columnname')
Таким образом, если во время работы во всех базах данных, не существует таблицы с именем «имя_таблица» с именем столбца «ColumnName» он должен пропустить процедуру для этой базы данных и перейдите к следующей базе данных. У меня есть база данных, которая имеет таблицу «имя_таблицы», но не имеет столбец «ColumnName» в этой таблице, и возвращает эту ошибку:
Invalid column name 'columnname'.
Почему это if exists
заявление идет внутри, если заявление? Не должно ли оно прекратиться, как только условие не будет выполнено? Как я могу справиться с этой ситуацией?
[Плохие привычки пинать: использование JOIN в старом стиле] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- joins.aspx) - стиль старого стиля * разделенный запятыми список таблиц * был заменен на * правильный * ANSI 'JOIN' синтаксис в ANSI - ** 92 ** SQL Standard (** более 20 лет **) назад) и его использование обескуражено –