【发布时间】:2017-07-05 08:11:52
【问题描述】:
我有一个应该按如下方式工作的存储过程:
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() 的实现依赖于在传递给链接服务器的动态 SQL 上调用EXEC,所以我相信它不能转换为表值函数。表值函数中不允许使用动态 SQL。
链接服务器通过 OLE-DB 提供程序进行通信,但它不是 SQL Server 实例。这是一个 OSISoft PI 过程历史数据库。通常,在单个查询中查询多个数据标签非常容易,但在这种情况下,我正在做一些计算,这需要我提供一个指定单个标签名称的过滤器表达式。所以每个标签都需要单独查询数据源。
据我所知,存储过程不能用作 JOIN 的右侧?
我还有哪些其他选择可以将这些结果整合在一起?只是一个光标?
编辑:我已经弄清楚了如何解决迫使我使用动态 SQL 和存储过程的潜在障碍。现在我可以使用常规 SQL,它允许我使用表值函数而不是存储过程,这允许我使用 JOIN 和 CROSS APPLY 而不是丑陋的游标黑客。
【问题讨论】:
-
您使用的 SQL Server 版本是什么?
-
SQL Server 2016 标准版
-
看起来我可能会使用光标来遍历标签列表。或者,标签列表将只包含 7 个项目,所以也许我可以将它们作为单独的参数传递,并静态调用
EXEC dbo.GetResultsForTag7 次。这两种解决方案看起来都很难看。
标签: sql-server stored-procedures sql-server-2016