Использование SSDT в качестве источника для шаблонов T4
У меня есть проект SQL Server Data Tools (SSDT), в котором есть ряд хранимых процедур, для которых я хотел бы сгенерировать код C# для их вызова с использованием T4. Существуют ли какие-либо примеры для этого?
Пока что я могу создать функцию для каждого процесса, но мне бы очень хотелось иметь возможность использовать метаданные, создаваемые SSDT, чтобы я мог получать из нее параметры, типы данных и возвращаемые значения, а не анализировать строки.
2 ответа
ОХЛАЖДЕНИЕ С КАПИТАЛОМ C! (но не говорите никому, кто использует ORM!)
Чтобы получить типы данных и т.д., убедитесь, что вы взяли последние версии DacExtensions от команды MS DacFx:
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. Это вернет объекты, на которые есть ссылки в хранимом теле proc, но не скажет вам, как они используются. Реляционная модель не пытается внедрить эту информацию, поскольку она не помогает при развертывании, но вы можете получить ее, запросив SQLDOM AST для процедуры.
AST - это синтаксическое дерево, определяющее фактическую структуру оператора процедуры, включая структуру тела процедуры. Что вам нужно сделать, это:
- Создайте посетителя, который посещает узлы SelectStatement (или их дочерние элементы)
- Найдите имена столбцов, используемые в select
- Сопоставьте эти имена с именами объектов, возвращаемых TSqlProcedure.BodyDependencies. Теперь у вас есть многофункциональный объект, который может указать таблицу, в которой содержится столбец, тип данных столбца и т. Д.
- Делайте все, что вам нужно, основываясь на этом (например, определите тип возвращаемого значения с правильными свойствами, соответствующими типам данных столбца?)
Несколько заметок / ресурсов:
- Ed's DacpacExplorer поможет вам увидеть и понять код.
- Дэйв Баллантайн только что добавил поддержку SQLDOM в DacpacExplorer. Это не только поможет вам увидеть, какие операторы должны совпадать в посетителе, вы также должны посмотреть, как они используют loadAsScriptBackedModel (см. Этот коммит), чтобы убедиться, что у вас есть полный AST для тела процедуры. Без этого вы бы просто получили тело как один объект SqlScript, который вам не очень полезен.
- Другими примерами шаблона посетителя являются TSqlSmells Дейва и проект DacExtensions.
- Твиттер - это простой способ связаться с Эдом, Дейвом и мной, если вы заблокированы:-)