2016-10-05 2 views
1

XXX_JOURNAL과 같이 테이블을 동적으로 생성했습니다. 여기서 XXX - 테이블 접두사 (변수)이고 _JOURNAL -은 테이블 이름에서 상수입니다.MS SQL 쿼리에서 테이블 이름 변수

  1. 를 만드는 방법 : 나는 두 가지 어려움이 그래서 여기

    CREATE TRIGGER triggerName ON %_JOURNAL 
    FOR UPDATE 
    AS 
    UPDATE XXX_JOURNAL 
    SET COMPANY_ID = LEFT(tableName,3) //tableName = current table (XXX_JOURNAL) 
    WHERE ID = ID FROM inserted 
    

    :

    나는하지 특정 테이블에 데이터베이스에 UPDATE 트리거를 만들고 변수로 테이블 이름 (접두사)를 사용하여 필요 모든 테이블에 대해 하나의 트리거 LIKE %_JOURNAL?

  2. 현재 테이블의 키워드로 테이블 이름을 사용하는 방법은 무엇입니까?

구문에 많은 실수가 있음을 알고 있습니다. 예를 들어 트리거 생성시 테이블 이름으로 '%_JOURNAL'을 사용할 수 없습니다. 그것은 단지 설명을위한 것입니다. 나는 미래에 모든 동적으로 생성 된 테이블에 대해 하나의 트리거를 생성해야합니다.

아이디어가 있으십니까?

CREATE PROCEDURE TriggerCreationForJournals 
    @XXX as nvarchar(3) 
AS 
BEGIN 

    DECLARE @sql nvarchar(max), 
      @triggerName nvarchar(max) = @XXX + N'_JOURNAL_UPDATE', 
      @objectCheck int, 
      @checkSQL nvarchar(max), 
      @params nvarchar(max) = N'@objectCheck int OUTPUT' 

    SELECT @checkSQL = N'SELECT @objectCheck = OBJECT_ID(N'''[email protected]+''')' 

    EXEC sp_executesql @checkSQL, @params, @objectCheck = @objectCheck OUTPUT 

    IF @objectCheck IS NULL 
    BEGIN 
     SELECT @sql = N' 
     CREATE TRIGGER '+QUOTENAME(@triggerName)+' ON ['[email protected]+'_JOURNAL] 
     FOR UPDATE 
     AS 
     UPDATE x 
     SET COMPANY_ID = '''[email protected]+''' 
     FROM ['[email protected]+'_JOURNAL] x 
     INNER JOIN inserted i 
      ON i.ID = x.ID' 

     EXEC sp_executesql @sql 
    END 
    ELSE 
    BEGIN 
     PRINT 'Trigger '+QUOTENAME(@triggerName)+' already exists' 
    END 
END 

다음이 실행 :

+1

왜 각 COMPANY_ID에 대해 별도의 테이블을 만드십니까? –

+0

나는 아무것도 만들지 않습니다. 공급 업체의 상자 응용 프로그램이 생성됩니다. 내가 할 수있는 유일한 방법은 이미 생성 된 테이블의 업데이트 정보입니다. –

답변

0

당신은 동적 SQL과 저장 프로 시저를 사용할 수 있습니다

DECLARE @sql nvarchar(max) 

SELECT @sql = (
    SELECT 'EXEC TriggerCreationForJournals '''+LEFT([name],3) +''';' +CHAR(10) 
    FROM sys.tables 
    WHERE [name] LIKE '%JOURNAL' 
    FOR XML PATH('') 
) 

EXEC sp_executesql @sql 

모든 테이블에 대한 트리거를 만들 수 있습니다. 그래서 그것의 작성을 생략하는 경우, 당신이 존재하는 경우이를 삭제하기 위해 SP를 수정할 수 있습니다 - 저장 프로 시저의 목적은 테이블에 트리거가 존재하는지 확인하는 것입니다

EXEC TriggerCreationForJournals 'AFG'; 
EXEC TriggerCreationForJournals 'DFG'; 

: @sql에서

쿼리처럼있을 것입니다.

두 번째 부분은 필요한 모든 테이블에 대해 스크립트를 만들고 SP를 실행하는 것입니다.

희망 사항은이 질문에 대한 답변입니다.