使用SSDT作为T4模板的源

我有一个SQL Server数据工具(SSDT)项目,它有许多存储过程,我想生成C#代码以使用T4调用它们。 这样做有没有现成的例子?

到目前为止,我可以创建一个每个proc的函数,但我真的希望能够利用SSDT创建的元数据,这样我就可以从中获取参数,数据类型和返回值,而不是进行字符串解析。

COOL与资本C! (但不要告诉任何使用ORM的人!)

要获取数据类型等,请确保从MS DacFx团队获取最新的DacExtensions:

https://github.com/Microsoft/DACExtensions

新的api(偶然使用T4模板编写)使得查找所需信息的次数简单了许多倍。

您需要在此博客中提供足够的信息才能让您前进:

https://the.agilesql.club/Blogs/Ed-Elliott/DacFx-Create-tSQLt-Tests-From-A-Dacpac

唯一的区别是您正在创建C#而不是T-SQL,因此您不必处理ScriptDom。

当你这样做时,请把它转储到github上听起来像一个非常有用的项目。

要在评论中回答这个问题 :

我可以使用正确的参数创建方法,但我很难找到模型中对象的位置,它们代表存储过程的内容。 我需要知道SELECT语句返回的列,以便生成返回对象。 有任何想法吗?

引用的对象由TSqlProcedure.BodyDependencies关系提供。 这将返回存储过程体中引用的对象,但不会告诉您如何使用它们。 关系模型不会尝试嵌入此信息,因为它在部署中没有帮助,但您可以通过查询SQLDOM AST来获取该过程。

AST是一个语法树,用于定义Procedure语句的实际结构,包括程序体的结构。 你需要做的是:

  • 创建访问SelectStatement节点(或其子节点)的访问者
  • 找到select中使用的列名称
  • 将这些名称映射到TSqlProcedure.BodyDependencies返回的对象的名称。 现在您有一个富对象,可以声明包含列的表,列的数据类型等。
  • 基于此做任何你需要的东西(例如,使用与列数据类型匹配的正确属性定义返回类型?)

一些笔记/资源:

  • Ed的DacpacExplorer将帮助您查看和理解代码。
  • Dave Ballantyne刚刚为DacpacExplorer添加了SQLDOM支持。 这不仅可以帮助您查看访问者需要匹配的语句,还应该查看他们如何使用loadAsScriptBackedModel(请参阅此提交 )以确保您拥有过程正文的完整AST。 如果没有这个,你只需要将主体作为一个SqlScript对象获取,这对你没有多大用处。
  • 访问者模式的更多示例是Dave的TSqlSmells和DacExtensions项目
  • 如果你被阻止,Twitter是一个简单的联系Ed,Dave和我的方式:-)