我有一个应该按如下方式工作的存储过程:
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而不是丑陋的光标黑客。
答案 0 :(得分:1)
将存储过程重写为表值函数??
或者,重新编写它以取消过滤器,将其转储到表(可能是临时表),然后加入到该表中。