使用带有动态数据库名称的MySQL链接服务器

问题描述 投票:0回答:1

我有一个表类别,它存在于测试数据库和生产数据库中。每当我必须从 MySQL 获取数据时,我都必须在数据库中编写 test 或 prod,如下所示,因为 openquery 不支持动态查询。

SELECT  * 
    INTO #Category
            FROM 
    OPENQUERY([MYSQLLINKEDSERVER], 'SELECT * from test.category') category

我已经尝试使用执行命令,因为它与动态查询一起使用。

declare @storeId as integer = 1

declare @query nvarchar(max) ='SELECT * from test.category where id = ?' 
exec(@query, @storeId) at [MYSQLLINKEDSERVER]

但问题是,每当我需要获取数据时,我都必须创建临时表,我有多个数据库和多个表,我不能每次都创建临时表。

我的问题是,我需要一种方法来传递像

declare @t nvarchar(250) = 'test'
这样的变量,并传递查询
select * from category
,它从MySQL测试数据库中获取数据并将其存储在临时表中,如下所示

select * into #category
 openqueryOrSOmelogic('select * from category','test')

我不想为临时表提供架构并提供变量中的数据库名称。

有什么办法可以实现吗?

sql mysql sql-server linked-server
1个回答
0
投票

您可以在使用 OPENQUERY 和动态 SQL sp_executesql 的查询中动态选择一个数据库(即

test
prod
)。您需要动态构建查询然后运行它,因为
OPENQUERY
不支持动态查询。

举个例子:


DECLARE @t NVARCHAR(250) = 'test'; — Database name eg : ( test or prod )

DECLARE @query NVARCHAR(MAX);

DECLARE @storeId int = 1; -- optional filter

SET @query = 'SELECT INTO #Category FROM OPENQUERY([MYSQLLINKEDSERVER], '' SELECT * FROM '+@t+'. category WHERE id = ' + CAST(@storeId AS NVARCHAR(10))===';

EXEC sp_executesql @query;

有了这个解决方案,每当您更改数据库时,就不会再为创建临时表架构而烦恼了。它还支持使用@storeId或任何其他参数进行过滤。

© www.soinside.com 2019 - 2024. All rights reserved.