2016-08-28 2 views
0

Я создал системную хранимую процедуру в базе данных 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 заявление идет внутри, если заявление? Не должно ли оно прекратиться, как только условие не будет выполнено? Как я могу справиться с этой ситуацией?

+0

[Плохие привычки пинать: использование 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 лет **) назад) и его использование обескуражено –

ответ

2

Это потому, что SQL Engine пытается скомпилировать код, поэтому он проверяет код внутри блока IF.

Вы должны использовать это сравнение вне хранимой процедуры, например. в вашей команде SET @sql = '......', но он не будет запускать этот SP, если столбец не существует.

Итак, вы можете попробовать что-то еще - построить запрос (переменную nvarchar) внутри SP и выполнить его как динамический SQL.

+0

Точно. Спасибо, @ Антон – Sher

Смежные вопросы