2009-12-09 2 views
0

여러 데이터베이스가있는 SQL Server가 있습니다. 엔티티와 ID 번호가있는 여러 테이블을 보유하고있는 메인 데이터베이스를 가지고 있습니다. 그런 다음 해당 엔티티 각각은 모든 정보가있는 상관 데이터베이스 (테이블이 아니라 데이터베이스 임)를 갖습니다. 예를 들어 MAIN 데이터베이스의 엔터티에 ID 번호가 1 인 경우 동일한 SQL Server에 SubDatabase1 데이터베이스가 있습니다.SQL Server의 동적 데이터 소스 저장 프로 시저

본질적으로, 내가 수행하려고하는 것은 SUB 데이터베이스에서 데이터를 수집하는 MAIN 데이터베이스의 저장 프로 시저를 만드는 것이지만 수집 한 SUB 데이터베이스는 Proc에 전달 된 ID 번호를 기반으로 결정해야합니다.

나는 이것이 완전히 잘못되었다는 것을 알고 있지만, 누군가 나를 위해이 빛을 비출 수 있는지 궁금해하고 있습니다.

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE PROCEDURE GetInstallationCount 
-- Add the parameters for the stored procedure here 
@installId int=0 
AS 
BEGIN 
    SET NOCOUNT ON; 

    //Trying to make the DatabaseName dynamic here!! 
    select count(*) from [email protected] 

END 
GO 

감사합니다 - J

답변

1

create dynamic SQL, 특히 sp_executesql에 대한 도움말을 읽어보십시오. 이 작업을 시작해야합니다 :

DECLARE @theSql varchar(1000) 
DECLARE @installId int 
SET @installId = 1 
SET @theSql = 'SELECT COUNT(*) FROM dbo.Installation' + CAST(@installId as nvarchar) + '.Names' 
EXEC (@theSql) 
+0

좋아, 나는이 사건을 생각했다. 그러나 내 인생에서 나는 알아낼 수 없었다. 감사합니다. – Dutchie432

+0

아, 그리고 그것은 installationXXXXX.dbo.Names, dbo.installationXXXXX.Names입니다. 이러한 프로그래밍 언어는 모두 내 머리 속에 들어 맞지 않습니다. – Dutchie432

0

당신은 그렇게 동적 SQL을 사용해야합니다. 테이블 이름과 데이터베이스 이름은 런타임에 다른 방법으로 확인할 수 없습니다.

Here is a good introduction Scott Mitchell.

0

확실히 선택 문자열을 동적으로 작성하여 실행하면되지만 실행은 좋지 않습니다.

매우 화려 해져서 파리의 동의어를 만들고 쿼리에서 사용하고 삭제할 수는 있지만 가치가 있을지 확신 할 수 없습니다.

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE PROCEDURE GetInstallationCount 
-- Add the parameters for the stored procedure here 
@installId int=0 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @sql nvarchar(MAX) 

    SET @sql = 'select count(*) from dbo.Installation' + Cast(@installId as nvarchar) + '.Names' 
    EXECUTE dbo.sp_executesql @sql 

END 
GO 
0

은 종종 이러한 질문에 대한 대답은 동적 SQL이다. 예를 들어, 동의어 dbo.MySpecialTable이 데이터베이스 DB_3의 테이블 dbo.SomeTable을 가리 키도록 설정합니다.

IF object_id(N'SN', N'dbo.MySpecialTable') IS NOT NULL 
     DROP SYNONYM dbo.MySpecialTable 
CREATE SYNONYM dbo.MySpecialTable FOR [DB_3].[dbo].[SomeTable] 

이렇게하면 실제 테이블 이름 대신 동의어를 사용하도록 모든 쿼리를 작성합니다. 동의어에는 DB 범위가 있으므로 저장 프로 시저에서 "대상 전환"을 한 곳에서 관리하십시오.

0

사용 동의어 :