从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。如果我硬编码它似乎工作,但我需要动态设置它。有什么帮助吗?
答案 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注入,因为它会让你接受一个非常简单的攻击。