2008-11-04 2 views
4

SQL Server 2005에는 두 개의 데이터베이스가 있습니다. 하나는 "A"이고 다른 하나는 "A_2"입니다. "A"는 사용자가 입력하는 변수 이름이고 두 번째 데이터베이스의 "_2"접두사는 항상 알려져 있습니다. (따라서 데이터베이스는 "MyDB"와 "MyDB_2"등이 될 수 있습니다.

실제 이름을 모르고 'exec'문을 사용하지 않고 저장 프로 시저 내에서 다른 데이터베이스에 액세스하는 방법은 무엇입니까?SQL Server에서 동적 이름을 사용하여 다른 데이터베이스에 액세스

답변

7

동의어라고하는 새 SQL Server 2005 기능을 사용해 볼 수 있습니다.

CREATE SYNONYM이 필요하고 동의어를 사용하여 저장 프로 시저를 컴파일하고 저장하십시오. 이렇게하면 나중에 동의어를 "즉시"변경할 수 있습니다. 분명히 CREATE SYNONYM 코드를 동적 SQL로 실행해야 할 필요가 있습니다.

CREATE SYNONYM을 실행하려면 사용자에게 해당 권한이 부여되어야하며 그렇지 않으면 ALTER SCHEMA 권한이 있어야합니다. 해당 경로로 이동하기 전에 동의어에 대해 더 자세히 읽으십시오. 몇 개의 문자열이 첨부되어 있습니다.

+0

이 힌트를 주셔서 대단히 감사합니다. 아직 테스트하지는 않았지만 매우 흥미로운 것 같습니다! – Marc

+1

그래서 나는 이것을 테스트했고 우리의 문제를 완벽하게 해결합니다. 설치하는 동안 한 번 정의 할 다른 데이터베이스의 각 테이블에 대해 동의어를 정의합니다. 최종 사용자가 너무 많은 권한을 갖지 않으므로이 방법으로 안전해야합니다. – Marc

0

나는 그것이 가능하다고 생각하지 않는다.

이름은 변수이며 데이터베이스 이름으로 변수를 사용할 수 없습니다.

그래서 유일한 방법은 전체 명령을 문자열에 놓고 실행하지 말고 피하는 것입니다.

전체적인 목적은 무엇입니까? 로직에서 데이터베이스의 이름을 지정하지만 로직과 사용자가 입력 한 이름 사이에 링크를 저장하면 어떨까요?

+0

를 들어 예 그게 대체 솔루션이 될 것입니다. 어쩌면 누군가가 DBNAME() 및 EXEC를 사용하는 것보다 다른 해결책을 알고 있다고 생각 ... – Marc

+0

불행히도 exec를 사용하지 않고 데이터베이스 이름이나 필드 이름으로 변수를 사용할 수 없습니다. 데이터베이스 스크립트에서 검색 및 바꾸기가 쉽기 때문에 그렇게 할 것입니다. – Biri

0

내가 수행 한 작업은 액세스하려는 각 테이블 (아마도 스키마는 동일합니다)에 대한보기를 만든 다음 내 후속 코드에서 방금보기를 참조했습니다. 설치하기 전에 데이터베이스 스크립트의 최종 값으로 데이터베이스 이름을 대체 할 소프트웨어의 조각을 작성 예를

if object_id('view_Table1') is not null 
    drop view view_Table1 

dim @cmd nvarchar(max) 

set @cmd = 'create view view_Table1 as select * from ' + @DbName + '.dbo.Table1' 

exec sp_executesql @cmd 

select WhateverColumn from view_Table1 
관련 문제