在FROM子句中以编程方式设置表名称

时间:2018-10-22 21:04:04

标签: sql sql-server linked-server

是否可以通过编程方式设置FROM子句中使用的表名?

原因是我们在生产环境与开发环境中具有不同的表名,因此我们需要根据不同的环境相应地设置表名以供我们的报告使用。

例如:

在生产中,数据库名称为123prd,在开发中,数据库名称为123dev

在生产中,数据库名称为456prd,在开发中为456dev

该报告针对数据库123prd运行,我们需要INNER JOIN到456prd数据库中的另一个表。

因此对于Prod环境,它将类似于以下内容:

USE 123prd
SELECT * 
FROM aTable a 
JOIN 456prd.dbo.bTable b 
ON a.id = b.id

但是,由于报表需要根据Prod vs. Dev的不同环境正确工作,因此我需要以编程方式更改FROM子句中的数据库名称。

这就是我所拥有的:

DECLARE @456DBName VARCHAR(16)
SET @456DBName = REPLACE(DB_NAME(), '123', '456')

USE 123prd
SELECT * 
FROM aTable a 
JOIN CONCAT(@456DbName, '.dbo.bTable') b 
ON a.id = b.id

使用CONCAT或+时出现错误无效的语法 关于如何以编程方式进行链接服务器是否有正确的方法?不好意思,不好意思的英语,希望我的问题有道理。

3 个答案:

答案 0 :(得分:0)

您的选择有限,因为您不能以这种方式设置项目。

一个选择是取消三部分的命名。只需引用数据库中的表 即可。如果生产/开发仅包含一个数据库,则此方法有效。

另一个选择是用视图包装所有引用(这些还可以包含业务逻辑)。如果“生产”和“开发”可以跨越多个数据库,则这特别有用。这些视图可以放在一个地方-但可能需要使用使用动态SQL的部署脚本来创建视图。

一个相关的选项将使用同义词。我没有为此目的亲自使用它们,但是它们应该可以工作。

最后,还有动态SQL。一种方法是存储查询,并让存储过程进行替换。哎呀,您甚至可以将查询存储为特定数据库的视图-并使用存储过程代替其他环境。

答案 1 :(得分:0)

答案 2 :(得分:0)

选项1.您可以使用代码来实现它,根据环境变量使用不同的方法并调用不同的存储过程或相同名称的不同架构。

选项2。您可以使用动态查询。您可以创建一个表来管理对要使用的架构/表的配置,具体取决于从服务器发送的参数。然后只需执行动态查询即可。

即。

DECLARE @Prefix VARCHAR(10) = 'dev';

DECLARE @Params NVARCHAR(200) = '@Prefix VARCHAR(10)'
     , @Query  NVARCHAR(MAX) = 'SELECT [Id] FROM [Schema].['+@Prefix+'TableName]';

EXECUTE [sp_executesql]
 @Query ,
 @Params ,
 @Prefix = @Prefix