在创建外部数据源时设置DATABASE_NAME时出错

时间:2016-11-11 13:16:07

标签: azure azure-sql-database

从SQL Server迁移到Azure时,我现在面临跨数据库调用的问题。我在 db1 db2 上都有一个名为“ sp_GetProfileDescription ”的SP。在 db1 上,调用“ sp_GetProfileDescription ”并将一些参数传递给它。 然后我动态选择 db2 的名称(根据调用的配置文件而有所不同),然后调用 db2 的' sp_GetProfileDescription '并传递沿着它的参数。

在SQL Server中,我确实喜欢这样:

<tr ng-repeat="user in data">

当迁移到Azure时没有我正在执行如下操作但是我收到一条错误,说“'@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               

    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

问题似乎是我在设置 DATABASE_NAME 时使用了vaiable。如果我硬编码它似乎工作,但我需要动态设置它。有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

尝试替换

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

(或类似的东西)

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

在这种方法中你应该小心SQL注入,因为它会让你接受一个非常简单的攻击。