我有一个表类别,它存在于测试数据库和生产数据库中。每当我必须从 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')
我不想为临时表提供架构并提供变量中的数据库名称。
有什么办法可以实现吗?
您可以在使用 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或任何其他参数进行过滤。