2016-11-11 1 views
0

SQL Server에서 Azure로 마이그레이션 할 때 현재 데이터베이스 간 호출 문제가 있습니다. 나는 sp_GetProfileDescription이라는 SP를 db1db2 모두에 있습니다. db1에 'sp_GetProfileDescription'이 호출되고 일부 매개 변수가 전달됩니다. 가 그럼 난 동적 DB2의 이름을 선택합니다 (이 호출 무엇 프로파일에 따라 다르다) 다음 DB2 년대 'sp_GetProfileDescription 전화'과의 매개 변수를 함께 전달합니다.외부 데이터 소스를 만들 때 DATABASE_NAME을 설정할 때 오류가 발생했습니다.

는 SQL 서버에서 나는 다음과 같이했다 :

@ConId int, 
@ProfileId varchar(100), 
@LanguageCode char(2) = NULL, 
@Description nvarchar(MAX) OUTPUT 
... 
... 
... 

DECLARE @dbName varchar(100) = NULL 

SELECT 
    @dbName = [providerDatabaseName] 
FROM 
    [Con] WHERE id = @ConId 

IF @dbName IS NOT NULL 
BEGIN    

    DECLARE @sql nvarchar(4000) = N'USE [' + @dbName +']; EXEC sp_GetProfileDescription @ProfileId, @LanguageCode, @Description OUTPUT'     

    EXEC sp_executesql @sql, N'@ProfileId varchar(100), @LanguageCode char(2), @Description nvarchar(MAX) OUTPUT', @ProfileId, @LanguageCode, @Description OUTPUT 

END 

아니, 난 아래처럼하고 있어요하지만 난라는 오류 받고 있어요 푸른로 마이그레이션 "근처 잘못된 구문이 '을 @dbname'." 그리고 그것은 "DATABASE_NAME = @dbName"을 가리키며 데이터 소스를 생성합니다.

@ConId int, 
@ProfileId varchar(100), 
@LanguageCode char(2) = NULL, 
@Description nvarchar(MAX) OUTPUT 
... 
... 
... 

DECLARE @dbName varchar(100) = NULL 

SELECT 
    @dbName = [providerDatabaseName] 
FROM 
    [Con] WHERE id = @ConId 

IF @dbName IS NOT NULL 
BEGIN    

    CREATE EXTERNAL DATA SOURCE ProviderDB 
    WITH 
    (
     TYPE=RDBMS, 
     LOCATION='mydomain.database.windows.net', 
     DATABASE_NAME= @dbName, 
     CREDENTIAL= dbadmin 
    ); 

    EXEC sp_execute_remote @data_source_name = N'ProviderDB', 
    @stmt = N'EXEC sp_GetProfileDescription @ProfileId, @LanguageCode, @Description OUTPUT', 
    @params = N'@ProfileId varchar(100), @LanguageCode char(2), @Description nvarchar(MAX) OUTPUT', 
    @[email protected], @[email protected], @[email protected] OUTPUT; 

END 

문제

DATABASE_NAME를 설정할 때 나는 vaiable을 사용하고 있다는 것 같다. 하드 코딩하면 작동하는 것처럼 보이지만 동적으로 설정해야합니다. 어떤 도움이 필요합니까?

답변

0

으로

CREATE EXTERNAL DATA SOURCE ProviderDB 
WITH 
(
    TYPE=RDBMS, 
    LOCATION='mydomain.database.windows.net', 
    DATABASE_NAME= @dbName, 
    CREDENTIAL= dbadmin 
); 

교체 (또는 뭔가 매우 유사) 시도

당신은 그것은 매우 간단 공격에 열려 잎으로, 그 접근 방식에서 SQL 주입 조심해야한다고
EXEC('CREATE EXTERNAL DATA SOURCE ProviderDB WITH(TYPE=RDBMS, LOCATION='mydomain.database.windows.net', DATABASE_NAME=' + @dbName + ', CREDENTIAL= dbadmin);') 

.

관련 문제