如何合并多次调用存储过程的结果?
How to consolidate results from multiple invocations of a stored procedure?
我有一个应该按如下方式工作的存储过程:
DECLARE @TagNames AS TABLE
(
tag NVARCHAR(50) NOT NULL
)
-- Get list of tags
INSERT INTO @TagNames
SELECT tag
FROM tagTable
WHERE tag LIKE @tagPattern
-- Create unified result set, combining results from stored proc for each tag
SELECT n.tag, r.time, r.value FROM @TagNames AS n
CROSS APPLY
dbo.GetResultsForTag(n.tag) AS r -- Not valid
但是,我无法使用 CROSS APPLY,因为 dbo.GetResultsForTag()
是一个存储过程。
dbo.GetResultsForTag()
的实现依赖于调用 EXEC
传递给链接服务器的动态 SQL,所以我相信它不能转换成 table - 值函数。 table 值函数中不允许使用动态 SQL。
链接服务器通过 OLE-DB 提供程序进行通信,但它不是 SQL 服务器实例。它是一个 OSISoft PI 过程历史数据库。通常,在单个查询中查询多个数据标签非常容易,但在本例中,我正在做一些计算,需要我提供一个指定单个标签名称的过滤器表达式。所以每个标签都需要单独查询数据源。
据我所知,存储过程不能用作 JOIN 的右侧?
我还有哪些其他选择可以将这些结果整合在一起?只是一个光标?
编辑:我已经想出如何解决迫使我使用动态 SQL 和存储过程的潜在障碍。现在我可以使用常规 SQL,这允许我使用 Table 值函数而不是存储过程,这允许我使用 JOIN 和 CROSS APPLY 而不是丑陋的游标 hacks。
将存储过程重写为 Table 值函数??
或者,重新编写它以取消过滤器,将其转储到 table(可能是临时 table),然后加入那个。
我有一个应该按如下方式工作的存储过程:
DECLARE @TagNames AS TABLE
(
tag NVARCHAR(50) NOT NULL
)
-- Get list of tags
INSERT INTO @TagNames
SELECT tag
FROM tagTable
WHERE tag LIKE @tagPattern
-- Create unified result set, combining results from stored proc for each tag
SELECT n.tag, r.time, r.value FROM @TagNames AS n
CROSS APPLY
dbo.GetResultsForTag(n.tag) AS r -- Not valid
但是,我无法使用 CROSS APPLY,因为 dbo.GetResultsForTag()
是一个存储过程。
dbo.GetResultsForTag()
的实现依赖于调用 EXEC
传递给链接服务器的动态 SQL,所以我相信它不能转换成 table - 值函数。 table 值函数中不允许使用动态 SQL。
链接服务器通过 OLE-DB 提供程序进行通信,但它不是 SQL 服务器实例。它是一个 OSISoft PI 过程历史数据库。通常,在单个查询中查询多个数据标签非常容易,但在本例中,我正在做一些计算,需要我提供一个指定单个标签名称的过滤器表达式。所以每个标签都需要单独查询数据源。
据我所知,存储过程不能用作 JOIN 的右侧?
我还有哪些其他选择可以将这些结果整合在一起?只是一个光标?
编辑:我已经想出如何解决迫使我使用动态 SQL 和存储过程的潜在障碍。现在我可以使用常规 SQL,这允许我使用 Table 值函数而不是存储过程,这允许我使用 JOIN 和 CROSS APPLY 而不是丑陋的游标 hacks。
将存储过程重写为 Table 值函数??
或者,重新编写它以取消过滤器,将其转储到 table(可能是临时 table),然后加入那个。