如何检索外部​​func / proc的完整定义?

时间:2017-11-22 17:54:42

标签: sql-server tsql scripting sqlclr

我想编写一个过程来构建sql代码来定义给定程序集中的所有func / procs。 程序和标量函数很简单 -  迭代sys.assemblies / modules / objects / parameters我可以为create func / proc。

准备代码

但我找不到存储tv函数返回的表定义的位置。像这样的函数的脚本是可能的,所以 - 表的定义必须写在somwhere ..

顺便说一下 - 第二个问题:是否有一些工具可以基于C#代码创建func / proc的sql定义?

1 个答案:

答案 0 :(得分:0)

就像表,表值函数(内联,SQL多语句和SQLCLR)一样,视图在sys.columns系统目录视图(和sys.all_columns)中维护。

SELECT obj.[name], obj.[type_desc], col.[name]
FROM   sys.objects obj
INNER JOIN sys.columns col
        ON col.[object_id] = obj.[object_id]
ORDER BY obj.[type_desc], obj.[name], col.[name];

您需要加入sys.types才能获得完整的数据类型名称。

但是,从那时起你就可以编写脚本了:

  1. 如果T-SQL包装器对象(对于Assembly中的SQLCLR方法)是由您编写的脚本创建的,那么您已经有了这些CREATE语句,并且
  2. 如果T-SQL包装器对象是由SSDT创建的(有或没有Visual Studio),那么您已经拥有“创建”脚本(如果您选择在每次构建时生成它)和增量“发布”脚本。
  3. 在任何一种情况下,这些对象都是从您应该已经拥有的T-SQL脚本创建的。除非,我想,你被交给了一个拥有这些对象的数据库,并且由于某种原因,部署脚本不可用。

      

    是否有一些工具可以根据C#代码创建func / proc的T-SQL定义?

    从数据库还是DLL / Assembly?有一些工具可用于从数据库中编写任何类型的对象的脚本。您还可以使用.NET SMO类来编写数据库中的定义脚本。如果要扫描DLL /程序集,则需要使用.NET Reflection类迭代每个方法,并查看SqlFunctionSqlProcedureSqlFacet属性/装饰器。