如何从数据库中获取 SQL CLR 函数的定义

How can I get the definition of a SQL CLR function from the database

我为一个 SQL CLR 项目提供的代码包含一个函数,其中 . However I have been able 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

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

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

有几种不同的 SQLCLR 对象类型,因此这需要一些查询。获取定义的最快和最简单的方法,尤其是对于一次性操作,是通过 SQL Server Management Studio (SSMS) 编写对象脚本。您应该能够 select "Object Explorer Details" 中的所有特定类型并将它们一起编写出来。

或者,要一次完成所有类型的所有 SQLCLR 对象,请转到常规 "Generate Scripts":

  1. 在对象资源管理器中右键单击数据库
  2. 转到 "Tasks >" 子菜单
  3. Select "Generate Scripts..."
  4. 选择"Select specific database objects"
  5. 深入了解各种对象类型——存储过程、用户定义的函数、用户定义的类型和用户定义的聚合——并检查你想要编写脚本的对象
  6. 点击"Next >"
  7. 选择您喜欢的保存/查看方式
  8. 点击"Next >"
  9. 点击"Next >"(再次审核后)
  10. 点击"Finish"

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

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}';