【问题标题】:Stored procedure output to view存储过程输出查看
【发布时间】:2015-10-15 23:55:00
【问题描述】:

我的软件只能从表格或视图中读取。我需要为这个软件提供一些来自clr 方法的数据(例如来自网络服务的数据)。这个软件会像这样读取数据:

select * from my_view WHERE somefield = 'data_identificator'

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

【问题讨论】:

  • 是的,你可以传递参数而不是'data_identificator'
  • 怎么做?请指出我该怎么做?
  • 在视图中无法做到这一点,但您可以调用函数吗?
  • 或者如果这个 somefield / 'data_identifiation' 存在于一个表中,那么你可以在函数之上构建一个视图并从那里加入数据
  • @JamesZ:我的软件(实际上,它不是“我的”,它是一些第三方软件,我无法更改)可以从视图和表中读取数据。我需要从外部数据源传递一些数据:一些网络服务。所以,我不能执行任何函数或过程(只有当它们模仿视图或表时)。加入的想法很有趣 - 也许它会起作用。

标签: sql sql-server sqlclr


【解决方案1】:

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

是的,可以使用 SQLCLR 从外部资源(例如 Web 服务等)获取数据。您可以编写专门的标量或表值函数来调用特定方法并返回解析后的输出。或者您可以创建一个通用函数来返回生成的 XML,然后在 T-SQL 中对其进行解析。

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

您的软件“只能从表或视图中读取”应该能够从此多语句表值函数 (TVF) 中 SELECT,因为它的作用类似于可以传递参数的视图进入。如果您的软件由于某种原因无法从 TVF 中进行选择,那么您可以将 SELECT field1, field2, ... FROM dbo.MyTVF(); 包装在 View 中。

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

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

【讨论】:

  • 好的,我创建了 TVF。但后来我不能传递参数 select * from TVF() WHERE field1 = 'somedata'。还是有可能?
  • 这很简单,如果内部 CLR 会返回大数据集,但是如果我需要从 SELECT 子句中为其提供一些参数呢?
  • @VikciaR 是的,CLR TVF 可以返回完整的结果集。要将值从 SELECT 传递到 TVF,您可以使用 CROSS APPLY(类似于 INNER JOIN:TVF 没有结果从 SELECT 中排除行)或 OUTER APPLY(类似于 OUTER JOIN :即使 TVF 没有返回任何内容,您也会从 SELECT 中获取行)。但是,请注意不要期望 WHERE 子句会阻止调用 TVF。如果主 SELECT 返回许多被过滤的行,则应首先将这些结果保存到表变量中,然后使用 CROSS APPLY 从表变量中 SELECT 到 CLR TVF。
【解决方案2】:

所以,经过一些研究并基于来自 srutzky 和 ​​JamesZ 的 cmets 最终答案。

  1. 创建 CLR 表值函数。
  2. 从某个帮助表创建视图,其中存储了所有可能的查询参数值。我不知道如何摆脱它。 (对我来说没问题,我有这样的桌子)。

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

如果我从那个角度SELECT
从我的视图中选择 *
WHERE PropertyA = '123456'
MyClrFunction 将使用参数 '123456' 执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2015-03-12
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    相关资源
    最近更新 更多