2016-08-28 4 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') 

그래서, 모든 데이터베이스에서 실행하는 동안 경우, 그 데이터베이스에 대한 절차를 생략해야하고 열 이름 'C 럼 이름'과 'TABLENAME'라는 이름의 테이블이 없습니다 다음 데이터베이스로 이동하십시오. 나는 'TABLENAME'테이블을 가지고 있지만,이 테이블의 '기둥 이름'열이없는 데이터베이스가 있으며이 오류 반환 : if 문

Invalid column name 'columnname'.

if exists 문 안쪽에 간다를? 조건이 충족되지 않는 즉시 종료해야합니까? 이 상황을 어떻게 처리 할 수 ​​있습니까?

+0

[나쁜 습관 : 오래된 스타일의 조인 사용] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- ANSI - ** 92 ** SQL 표준 (** 20 년 이상 **)에서 * * ​​ANSI'JOIN' 구문으로 구식 * * 쉼표로 구분 된 테이블 목록이 대체되었습니다. 이전에) 그리고 그것의 사용은 낙담했다 –

답변

2

SQL 엔진이 코드를 컴파일하려고하므로 IF 블록 내의 코드를 검사하기 때문입니다.

저장 프로 시저 외부에서 해당 비교를 사용해야합니다. SET @sql = '......'명령에 있지만 열이 없으면 해당 SP가 실행되지 않습니다.

SP에서 쿼리 (nvarchar 변수)를 빌드하고 동적 SQL로 실행하십시오.

+0

정확하게. 고마워, @Anton – Sher

관련 문제