我的团队对远程 PostgreSQL 数据库具有只读访问权限 - 我们使用链接服务器连接从本地 SQL Server 实例远程查询该数据库。我们无法以任何方式修改远程服务器的数据库。
目前,我们通过使用
EXECUTE (@strSQL) AT [RemoteServer]
运行一些相当大的临时 SQL 脚本来让远程服务器完成繁重的工作,其中 @strSQL
是一些复杂的 PostgreSQL SELECT
语句。我们正在尝试将一些常用查询捕获为视图,这在大多数情况下都有效:
CREATE VIEW [dbo].[vwRemoteData] AS
SELECT * FROM OPENQUERY([RemoteServer], 'SELECT ... <PostgreSQL logic here>')
但是当查询字符串超过 8000 个字符时,此方法会失败。
以“SELECT ...”开头的字符串太长。最大长度为 8000。
失败的尝试:通常,超过 8000 个字符串的解决方法是
DECLARE
一个变量,cast
到 nvarchar(max)
,和/或使用字符串连接 - 但这些事情似乎都不允许在 OPENQUERY 中进行调用,(并且 VIEW 不支持 DECLARE
或 EXECUTE ... AT [RemoteServer]
)。
我也尝试过使用 4 部分标识符语法来摆脱对
EXECUTE ... AT
或 OPENQUERY
的调用,但这需要将 PostgreSQL 逻辑转换为 TSQL,这并不总是那么简单,而且性能似乎很差更糟糕(几小时与几分钟) - 大概是因为 SQL 试图通过网络传输远程表行并在本地执行一些连接/过滤。
作为一种解决方法,我们目前手动将查询结果执行到一个新的 SQL 表中,然后处理该表,但随后我们遇到了手动数据同步问题,这是我们希望避免的。
上下文:预期用途最终是将 Power BI 指向其中一些大型视图,并让它每晚刷新相应的数据集。我们试图避免必须将远程查询结果“具体化”到我们自己的 SQL 表中的额外步骤,部分原因是它很大(约 6000 万行),但也因为这似乎需要引入某种类型的超出当前 SQL + Power BI 设置的日常 ETL 解决方案。 Power BI 无法直接连接到远程 Postgres 服务器,只能连接到我们的本地 SQL 服务器。
问题:谁能想到一种解决方法,让我们可以将此业务逻辑捕获为视图或类似的可查询实体,Power BI 可以从中刷新数据集?您会以完全不同的方式解决这个问题吗?
我不知道它是否适合您,但您可以在视图中使用 EXECUTE AT。
类似这样的:
CREATE OR ALTER VIEW PostGres AS
select *
from openquery(LOCALHOST,'
set nocount ON;
declare @sql nvarchar(max) = ''select N'''''' + replicate(cast(''A'' as nvarchar(max)), 444) + ''''''''
exec(@sql) at POSTGRESERVER with result sets((A nvarchar(max)))')
这是一种潜在的解决方案,因为 OPENQUERY 可以运行任何代码,您可以在其中构建实际的查询。 重要的是你:
SET NOCOUNT ON
with result sets
限定符当然,如果远程服务器不喜欢 EXEC 中的长字符串,它仍然可能会失败。
然后,您实际上可以将查询字符串存储在 PGSQL 中,并使用动态执行它所需的任何措施。
这有点像黑客,在 PostGre 方面创建一个视图会容易得多。