2012-12-21 3 views
4

데이터베이스 이름은 다르지만 테이블과 데이터는 같지만 스크립트가 다른 두 서버에서 실행되어야합니다. 이를 위해 다음 문장을 사용해 보았습니다. 조건문을 사용하여 데이터베이스를 사용하십시오.

if (@@servername= 'srvrA') 
    begin 
     use dbA 
    end 
else  
begin 
     use dbB 
    end 

그러나 srvrB에 대한

, 그것은 데이터베이스 DBA가 존재하지 않는다고 말했습니다.

누군가이 문제를 해결할 수 있습니까?

+1

처럼 보일 것입니다. – PeterJ

+1

방금 ​​실험을했는데 문제는 표현식이 거짓으로 평가 되더라도 dbA의 존재 여부가 확인된다는 것입니다. EXEC 명령문에 동봉 된 것으로 생각했지만 추가 검사시 데이터베이스를 변경하지 않았지만 여전히 기본값을 사용하고있었습니다. 좋은 해결책이없는 경우 빈 데이터베이스 스키마를 만들어서 주위를 둘러 볼 수 있다고 생각합니다. 또는 명령 행에서 데이터베이스를 지정하는 스크립트를 호출하고 USE를 모두 제거하십시오. – PeterJ

답변

1

하나 더 많은 옵션

뭔가 같은 :

sp_addlinkedserver 
    @server= N'srvrA', 
    @srvproduct= N'', 
    @provider= N'SQLNCLI', 
    @datasrc= N'srvrA'; 

sp_addlinkedsrvlogin 
    @rmtsrvname = 'srvrA' , 
    @useself = 'FALSE' , 
    @locallogin = 'your_local_login' , 
    @rmtuser = 'your_remote_login' , 
    @rmtpassword = 'your_password' 

그리고 스크립트는 내가, 당신이 사용하고있는 데이터베이스 엔진에 대한 태그를 추가 그래서 아마 가치가 데이터베이스 구체적으로 의심되는이 같은 질문에 대해

DECLARE @@srvname nvarchar(10) = 'srvrA' 

IF (@@servername = @@srvname) 
    BEGIN 
    SELECT * 
    FROM srvrA.dbA.your_schema.your_table 
    END  
ELSE  
    BEGIN 
    SELECT * 
    FROM srvrB.dbB.your_schema.your_table 
    END  
-1

SQLCMD 모드를 활성화하면 목표를 달성 할 수 있습니다. SQL 관리 스튜디오의 쿼리 메뉴에서 SQLCMD 모드를 토글합니다. 그러면 다음 스크립트가 작동합니다.

if (@@servername = 'srvrA') 
    begin 
     :setvar dbname dbA 
     use $(dbname) 
    end 
else  
    begin 
     :setvar dbname dbB 
     use $(dbname) 
    end 
+1

이것은 작동하지 않습니다. SQLCMD 변수는 스크립트 실행 전에 설정됩니다. 'dbname'은 항상 마지막': setvar'의 값이 될 것입니다 –

관련 문제