解决 VIEW 内 OPENQUERY SQL 语句 >8000 个字符的限制

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

我的团队对远程 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 可以从中刷新数据集?您会以完全不同的方式解决这个问题吗?

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

我不知道它是否适合您,但您可以在视图中使用 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 可以运行任何代码,您可以在其中构建实际的查询。 重要的是你:

  1. 针对您自己的 sql 服务器的 OPENQUERY
  2. 您通常首先需要
    SET NOCOUNT ON
  3. 所有结果集都必须使用
    with result sets
    限定符
  4. 进行声明
  5. 使用 EXECUTE AT REMOTE_SERVER 语法进行实际执行。
  6. 您可能需要禁用所有 DTC 和交易内容

当然,如果远程服务器不喜欢 EXEC 中的长字符串,它仍然可能会失败。

然后,您实际上可以将查询字符串存储在 PGSQL 中,并使用动态执行它所需的任何措施。

这有点像黑客,在 PostGre 方面创建一个视图会容易得多。

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