【问题标题】:Calling T-SQL stored procedure from CLR stored procedure从 CLR 存储过程调用 T-SQL 存储过程
【发布时间】:2011-12-17 20:10:29
【问题描述】:

非常简短的背景: 我们正在利用 CLR 存储过程通过 Active Directory 对查询结果应用访问控制,以相应地限制最终用户可以看到的内容。简而言之,这是通过从数据表中删除用户不满足访问结果(在本例中为文档)的标准的行来完成的。

此过滤之前已在客户端上完成,然后才显示结果。 SQL 2008 和更强大的服务器是将此访问过滤从客户端移除的动机。

我想知道的是,从等效的 CLR 存储过程调用原始常规 T-SQL 存储过程,而不是将“内联”T-SQL 传递到命令对象(其中在这种情况下,只是原来的 T-SQL 是一个存储过程)?我找不到有人提到这一点的任何地方(部分原因可能是因为它作为 CLR SP 的示例会非常令人困惑,我猜 :-))。 在我看来,您可能会因为 T-SQL 存储过程已经被优化和编译?

有人可以帮我确认吗?

希望我已经足够清楚了。非常感谢,

科尔姆。

【问题讨论】:

    标签: sql-server-2008 stored-procedures clrstoredprocedure


    【解决方案1】:

    如果您的 SQL CLR 存储过程正确执行特定查询(很好地参数化)并且相当频繁地执行它,那么该 T-SQL 查询将只在整个“确定最佳执行计划”序列中运行一次,然后存储在SQL Server 的计划缓存(并且不会比类似的 T-SQL 存储过程更快地从其中驱逐)。

    因此,它将与原始 T-SQL 存储过程一样“预编译”。从这个角度来看,我没有看到任何好处。

    如果您可以在 SQL CLR 过程中调整您的 SQL 语句,使其实际上甚至不会将这些行包含到您最终会丢弃的结果集中,那么您的 SQL-CLR 存储执行正确参数化的 T-SQL 查询的过程甚至可能比让标准 T-SQL 存储过程返回太多需要再次排除某些行的数据快一点。

    【讨论】:

    • 这是有道理的。我也会考虑调整 SQL 语句。也许我可以将 SID 传递到 T-SQL 查询本身,因为它们已经可用于在 CLR SP 中过滤该查询的结果。非常感谢您的帮助,马克。
    猜你喜欢
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多