【问题标题】:How can I get the definition of a SQL CLR function from the database如何从数据库中获取 SQL CLR 函数的定义
【发布时间】:2017-12-18 09:43:37
【问题描述】:

我为 SQL CLR 项目提供的代码包含一个函数,其中 .net implementation is invalid.但是我已经能够run a query 确认服务器上有一个名称无效的函数。

Schema  name            assembly_name  assembly_class              assembly_method  permission_set_desc  type_desc
dbo     ConvertFromUTC  database       AppName.Database.Functions  ConvertFromUTC   UNSAFE_ACCESS        CLR_SCALAR_FUNCTION

这些信息足以确认部署的版本是标量函数,而不是可疑的表。

我有没有办法从加载到数据库中的版本中获取输入/输出参数,以确保正确的版本是我上一个问题中建议的版本,而不是其他问题?更一般地说,我希望能够为数据库中的所有其他 CLR 函数获得相同的结果,以查看它们是否与我给出的代码不匹配。

【问题讨论】:

  • 您可以在 sys.parameters 视图中查看参数。

标签: c# .net sql-server sqlclr


【解决方案1】:

有几种不同的 SQLCLR 对象类型,因此这需要一些查询。获取定义的最快和最简单的方法,特别是对于一次性操作,是通过 SQL Server Management Studio (SSMS) 编写对象脚本。您应该能够在“对象资源管理器详细信息”中选择所有特定类型并将它们一起编写脚本。

或者,要一次性完成所有类型的所有 SQLCLR 对象,请转到通用“生成脚本”:

  1. 在对象资源管理器中右键单击数据库
  2. 转到“任务>”子菜单
  3. 选择“生成脚本...”
  4. 选择“选择特定数据库对象”
  5. 深入了解各种对象类型 - 存储过程、用户定义的函数、用户定义的类型和用户定义的聚合 - 并检查您要编写脚本的对象
  6. 点击“下一步>”
  7. 选择您喜欢的保存/查看方法
  8. 点击“下一步>”
  9. 点击“下一步>”(再次审核后)
  10. 点击“完成”

对于仅用户定义的聚合 (UDA) 和标量用户定义的函数 (UDF),您可以使用以下查询(请记住,0parameter_id 是返回类型):

SELECT OBJECT_NAME(am.[object_id]) AS [Name], am.*, p.*, t.[name] AS [DataType]
FROM   sys.assembly_modules am
INNER JOIN sys.parameters p
        ON p.[object_id] = am.[object_id]
INNER JOIN sys.types t
        ON t.[user_type_id] = p.[user_type_id]
WHERE  OBJECT_NAME(am.[object_id]) = N'{function_name}';

【讨论】:

  • 我希望能够获得相应的 .net 定义而不是 SQL 定义,但我应该能够使用它提供的内容。
  • 您需要更清楚地了解“.NET 定义”...您当然可以在其中包含程序集,但我没有提到它,因为我认为一堆十六进制字节不会出现帮助很大。如果您需要源代码,则需要将程序集导出为二进制文件(没有内置方法可以执行此操作),然后使用 ILspy 等反汇编程序查看它。
  • 好的。如果没有任何内置支持,我所希望的听起来会比值得做的麻烦更多。
  • 您可以编写/使用 SQLCLR 函数将程序集字节导出到二进制 DLL 中,然后使用 ILspy。您也极有可能将源代码与二进制文件一起上传。执行SELECT * FROM sys.assembly_files WHERE assembly_id <> 1 ORDER BY [assembly_id], [file_id];,如果您有任何大于 1 的 file_ids,则通常是源代码或 PDB 调试文件。如果是源代码(你可以通过名称来判断),那么可以转换为 NVARCHAR 以查看源代码。另外,我刚刚用一个基本查询更新了我的答案,以获取为 UDA 和标量 UDF 请求的信息。
猜你喜欢
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多