我目前有一个在存储过程中查询的链接服务器。我的查询目前工作得很好,但是这个查询需要针对我拥有的每个代码分支进行更改。我想知道派生我在跨服务器查询中调用的数据库名称的最佳方法是什么。
例如:服务器 A 有一个到服务器 B 的链接。服务器 A 包含 3 个数据库。SRV_A.DB1_DEV、SRV_A.DB2_Trunk、SRV_A.DB3_Prod 每个都链接到它们的服务器 B 对应项... SRV_B.DB1_DEV、SRV_B.DB2_Trunk、SRV_B.DB3_Prod
服务器 A 上的每个数据库都有相同的存储过程。存储过程中唯一改变的是跨服务器选择。所以 SRV_A.DB1_Dev 在存储过程中有一个选择,内容如下:
SELECT foo FROM [SRV_B].[DB1_DEV].[foo_table] WHERE bar = 1
而主干分支上的存储过程将是
SELECT foo FROM [SRV_B].[DB2_Trunk].[foo_table] WHERE bar = 1
因为我想要一个 VS 项目,将数据库部署到提到的每个分支,我希望能够动态填写数据库名称。我想出的解决方案是使用 CHARINDEX 函数进行一系列 IF 检查,然后使用动态 SQL 创建查询,如下所示:
DECLARE @dSql NVARCHAR(4000);
DECLARE @databaseName NVARCHAR(100) = DB_NAME();
DECLARE @tableName NVARCHAR(100);
IF SELECT CHARINDEX('Dev', @databaseName, 0)
SET @tableName = '[SRV_B].[DB1_DEV].[foo_table]
...Same if & set for Trunk
...Same if & set for Prod
SET @dSql = 'DECLARE @retID INT;SELECT foo FROM ' + @tableName
+ ' WHERE bar = 1';SET @retID = SELECT SCOPE_IDENTITY()'
EXEC(@dSQL);
我不得不想象有一个更好的解决方案,如果有人可以帮助我,将不胜感激。如果通过一些外线投篮,这是最好的方法,也让我知道。
谢谢,詹姆斯