【问题标题】:Getting the definition of a CLR Stored Procedure获取 CLR 存储过程的定义
【发布时间】:2017-06-11 20:43:10
【问题描述】:

我编写了一个 CLR 存储过程(用于发送电子邮件,而不是依赖于 DatabaseMail,因为有人告诉我这样更安全)。

它按预期工作。我现在想学习的是如何从 CLR 对象(CLR SP、CLR 标量函数等)中获取定义。

我已经尝试过:

  • sys.sql_modules,

  • sys.system_sql_modules,

  • OBJECT_DEFINITION()

但它返回一个空定义。

还有其他方法可以获取 CLR 对象的定义吗?

【问题讨论】:

  • 如果你写了,你有源代码。你想做什么?
  • @BenThul 不多,真的;只是想尽可能多地学习。我正在自己学习 SQL CLR,所以当我检查 sys.sql_modules 以寻找标量函数(SQL 函数)时,我发现这很奇怪,而且我注意到那里没有关于 CLR 对象的任何内容。这让我想知道是否真的有可能得到它。
  • @soulblazer 我刚刚更新了我的答案以澄清一点,并添加了指向我正在撰写的一系列文章的链接,以帮助人们学习如何使用 SQLCLR :-)。

标签: sql-server ddl sqlclr


【解决方案1】:

SQLCLR 对象没有 T-SQL 代码,因此没有可使用 sys.* _sql_modules DMV 或 OBJECT_DEFINITION() 内置函数检索的内容。

如果你想要底层的 .NET 代码,那就是在程序集中,它位于:sys.assembly_files

SELECT *
FROM   sys.assembly_files
WHERE [file_id] = 1;

如果您没有源代码,可以通过反汇编程序提取。

如果您想要 CREATE PROCEDURE ... AS EXTERNAL NAME ... ; 语句,则需要从多个 DMV 拼凑而成:sys.assembly_modulessys.typessys.parameterssys.columns。您还需要使用OBJECT_NAMEOBJECT_SCHEMA_NAME 内置函数。如果您尝试重新创建 CREATE TYPE 语句,则需要检查 sys.assembly_types DMV。

此外,要了解有关使用 SQLCLR 的更多信息,请参阅我在 SQL Server Central 上撰写的关于此主题的系列文章:Stairway to SQLCLR(需要免费注册才能阅读其内容)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    相关资源
    最近更新 更多