存储过程输出查看

Stored procedure output to view

我的软件只能从表或视图中读取。我需要向该软件提供来自 clr 方法的一些数据(例如来自 Web 服务的数据)。该软件将读取这样的数据:

select * from my_view WHERE somefield = 'data_identificator'

然后 clr 需要获取那个字段作为参数并执行一些其他代码,然后 return 从视图中输出类似结果。有可能吗?

如果提供预期代码的完整示例而不是其中的一部分,这个问题会更容易回答,但我认为我的理解足以引导正确的方向。

是的,可以使用 SQLCLR 从 Web 服务等外部源获取数据。您可以编写专门的标量或 table 值函数来调用特定方法和 return 解析输出。或者你可以创建一个通用函数,returns 结果 XML,然后在 T-SQL.

中解析它

如果您需要执行多个步骤,那么您可以从 T-SQL 多语句 Table 值函数中调用该 SQLCLR 函数。这甚至使您能够传入参数。

您的软件 "which can read only from tables or views" 应该 能够 SELECT 从这个多语句 Table 值函数 (TVF) 中,因为它就像一个查看您可以将参数传递给。如果您的软件出于某种原因无法从 TVF select,那么您可以将 SELECT field1, field2, ... FROM dbo.MyTVF(); 包装在 View.

您究竟是如何编写这样一个 SQLCLR 函数来调用 Web 服务的?没那么快。如果您一开始就问这个问题,那么将这种性质的代码 复制并粘贴到项目中弊大于利。是的,在各种站点上有几个示例,甚至可能在这里,在 SQLCLR 函数或过程中调用 Web 服务,但有些(甚至可能是大多数?)做得很差。即使您有 .NET 编程经验,您也需要了解 SQL 服务器的 CLR 主机的一些细微差别。因此,如果不先了解环境的限制以及如何与 SQL 服务器正确交互,您真的不应该编写 SQLCLR 代码。为此,我已经开始在 SQL Server Central 上撰写系列文章:Stairway to SQLCLR(需要免费注册)。

我还要提到,对于任何对调用 URI 感兴趣但不愿意或不能编写任何代码来实现它的人,有一个名为 [= 的 Table 值函数SQL# SQLCLR 库中的 36=] 执行此操作。全面披露:我是 SQL# 的作者,虽然有免费版,但 INET_GetWebPages 功能仅在完整版中可用。

因此,经过一些研究并根据 srutzky 和 ​​JamesZ 的评论得出最终答案。

  1. 创建 CLR Table 值函数。
  2. 根据一些帮助创建视图 table,其中存储了所有可能的查询参数值。我不知道如何摆脱它。 (这对我来说不是问题,我有这样的table)。

CREATE VIEW [dbo].[MyView] AS SELECT a.*, s.ValueFromTvf FROM HelpTable a CROSS APPLY dbo.MyClrFunction(a.PropertyA) s

如果我SELECT从那个角度来看:
SELECT * 来自 MyView
WHERE PropertyA = '123456'
MyClrFunction 将使用参数“123456”执行。