使用 SSDT 作为 T4 模板的来源
Using SSDT as source for T4 templates
我有一个 SQL 服务器数据工具 (SSDT) 项目,其中包含许多存储过程,我想为其生成 C# 代码以使用 T4 调用它们。是否有这样做的现有示例?
到目前为止,我可以为每个 proc 创建一个函数,但我真的希望能够利用 SSDT 创建的元数据,以便我可以获得参数、数据类型和 return 值从它而不是进行字符串解析。
用大写的 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 这听起来是一个非常有用的项目。
在评论中回答:
I can create methods with the correct parameters, but I'm struggling
to find where the objects are in the model are that represent the
content of a stored procedure. I need to know the columns returned by
a SELECT statement in order to generate the return objects. Any ideas?
引用对象由TSqlProcedure.BodyDependencies关系提供。这将 return 存储过程主体中引用的对象,但不会告诉您如何使用它们。关系模型不会尝试嵌入此信息,因为它对部署没有帮助,但您可以通过查询过程的 SQLDOM AST 来获取它。
AST 是一个语法树,定义了 Procedure 语句的实际结构,包括过程主体的结构。您需要做的是:
- 创建访问 SelectStatement 节点(或其子节点)的访问者
- 查找select
中使用的列名
- 将这些名称映射到 return 由 TSqlProcedure.BodyDependencies 编辑的对象的名称。现在您有一个丰富的对象,可以说明 table 列包含在其中、列的数据类型等。
- 在此基础上做任何你需要做的事情(例如定义一个 return 具有与列数据类型匹配的正确属性的类型?)
一些注意事项/资源:
- Ed 的 DacpacExplorer 将帮助您查看和理解代码。
- Dave Ballantyne 刚刚向 DacpacExplorer 添加了 SQLDOM 支持。这不仅可以帮助您了解需要在访问者中匹配哪些语句,还应该查看它们如何使用 loadAsScriptBackedModel(请参阅 this commit)以确保您拥有过程主体的完整 AST。如果没有这个,你只会将正文作为一个 SqlScript 对象获取,这对你来说用处不大。
- 访问者模式的更多示例是 Dave 的 TSqlSmells and the DacExtensions 项目
- 如果你被屏蔽了,Twitter 是一种联系 Ed、Dave 和我的简单方式:-)
我有一个 SQL 服务器数据工具 (SSDT) 项目,其中包含许多存储过程,我想为其生成 C# 代码以使用 T4 调用它们。是否有这样做的现有示例?
到目前为止,我可以为每个 proc 创建一个函数,但我真的希望能够利用 SSDT 创建的元数据,以便我可以获得参数、数据类型和 return 值从它而不是进行字符串解析。
用大写的 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 这听起来是一个非常有用的项目。
在评论中回答
I can create methods with the correct parameters, but I'm struggling to find where the objects are in the model are that represent the content of a stored procedure. I need to know the columns returned by a SELECT statement in order to generate the return objects. Any ideas?
引用对象由TSqlProcedure.BodyDependencies关系提供。这将 return 存储过程主体中引用的对象,但不会告诉您如何使用它们。关系模型不会尝试嵌入此信息,因为它对部署没有帮助,但您可以通过查询过程的 SQLDOM AST 来获取它。
AST 是一个语法树,定义了 Procedure 语句的实际结构,包括过程主体的结构。您需要做的是:
- 创建访问 SelectStatement 节点(或其子节点)的访问者
- 查找select 中使用的列名
- 将这些名称映射到 return 由 TSqlProcedure.BodyDependencies 编辑的对象的名称。现在您有一个丰富的对象,可以说明 table 列包含在其中、列的数据类型等。
- 在此基础上做任何你需要做的事情(例如定义一个 return 具有与列数据类型匹配的正确属性的类型?)
一些注意事项/资源:
- Ed 的 DacpacExplorer 将帮助您查看和理解代码。
- Dave Ballantyne 刚刚向 DacpacExplorer 添加了 SQLDOM 支持。这不仅可以帮助您了解需要在访问者中匹配哪些语句,还应该查看它们如何使用 loadAsScriptBackedModel(请参阅 this commit)以确保您拥有过程主体的完整 AST。如果没有这个,你只会将正文作为一个 SqlScript 对象获取,这对你来说用处不大。
- 访问者模式的更多示例是 Dave 的 TSqlSmells and the DacExtensions 项目
- 如果你被屏蔽了,Twitter 是一种联系 Ed、Dave 和我的简单方式:-)