使用SSDT作为T4模板的源

时间:2015-04-09 15:30:50

标签: c# .net t4 sql-server-data-tools

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

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

2 个答案:

答案 0 :(得分:5)

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上,这听起来像是一个非常有用的项目。

答案 1 :(得分:1)

在评论中回答this question

  

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

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

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

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

一些笔记/资源:

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