Использование SSDT в качестве источника для шаблонов T4

У меня есть проект SQL Server Data Tools (SSDT), в котором есть ряд хранимых процедур, для которых я хотел бы сгенерировать код C# для их вызова с помощью T4. Существуют ли какие-либо существующие примеры для этого?

Пока что я могу создать функцию для каждого процесса, но мне бы очень хотелось иметь возможность подключаться к метаданным, создаваемым SSDT, чтобы я мог получать из него параметры, типы данных и возвращаемые значения, а не выполнять синтаксический анализ строк.


person adam0101    schedule 09.04.2015    source источник


Ответы (2)


КРУТО С БОЛЬШОЙ С! (но не говорите никому, кто использует 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, это звучит как действительно полезный проект.

person Ed Elliott    schedule 09.04.2015
comment
Было бы здорово иметь его — автогенератор для классов Entity Framework Code First был бы отличным примером использования. - person Kevin Cunnane; 10.04.2015
comment
Я часто думаю о том, чтобы сделать ORM, который позволяет вам вызывать только хранимые процедуры, и, может быть, когда-нибудь сделает это! - person Ed Elliott; 10.04.2015
comment
Спасибо! Это может иметь большой потенциал. Я могу создавать методы с правильными параметрами, но я изо всех сил пытаюсь найти, где в модели находятся объекты, представляющие содержимое хранимой процедуры. Мне нужно знать столбцы, возвращаемые оператором SELECT, чтобы сгенерировать возвращаемые объекты. Любые идеи? - person adam0101; 10.04.2015
comment
С другой стороны, идея @Kevin использовать это для классов Entity Framework должна быть довольно простой. Я мог бы собрать что-нибудь вместе и выложить на GitHub. - person adam0101; 10.04.2015
comment
@EdElliott, я добавил здесь дополнительный вопрос относительно получения объектов SelectStatement . Я попытался повторить то, что сделал Дейв для DacpacExplorer, но у меня возникли некоторые проблемы. Не могли бы вы взглянуть? - person adam0101; 11.04.2015
comment
@EdElliott, вот мой первый выпуск на github, если вы хотите его проверить: github.com/aeslinger0/sqlsharpener - person adam0101; 21.04.2015
comment
круто, я видел, как Кевин разместил это в твиттере, и немного посмотрел ранее в поезде - я посмотрю поближе, когда у меня будет шанс, но это выглядит великолепно, спасибо, что поделились! - person Ed Elliott; 21.04.2015
comment
Это великий Адам. Я прошу нашего менеджера проверить это, так как это очень полезно для сценариев, в которых вы хотите использовать EF в качестве ORM, но иметь поддержку проектов баз данных для обхода некоторых ограничений разработки кода в первую очередь. - person Kevin Cunnane; 27.05.2015

Чтобы ответить на этот вопрос в комментариях:

Я могу создавать методы с правильными параметрами, но я изо всех сил пытаюсь найти, где в модели находятся объекты, представляющие содержимое хранимой процедуры. Мне нужно знать столбцы, возвращаемые оператором SELECT, чтобы сгенерировать возвращаемые объекты. Любые идеи?

Ссылочные объекты предоставляются отношением TSqlProcedure.BodyDependencies. Это вернет объекты, на которые есть ссылки в сохраненном теле процедуры, но не скажет вам, как они используются. Реляционная модель не пытается внедрить эту информацию, поскольку она не помогает при развертывании, но вы можете получить ее, запросив SQLDOM AST для процедуры.

AST представляет собой синтаксическое дерево, определяющее фактическую структуру оператора процедуры, включая структуру тела процедуры. Что вам нужно сделать, это:

  • Создайте посетителя, который посещает узлы SelectStatement (или их дочерние элементы).
  • Найдите имена столбцов, используемые в выборке
  • Сопоставьте эти имена с именами объектов, возвращаемых TSqlProcedure.BodyDependencies. Теперь у вас есть богатый объект, который может указать таблицу, в которой содержится столбец, тип данных столбца и т. д.
  • Делайте все, что вам нужно, на основе этого (например, определите тип возвращаемого значения с правильными свойствами, соответствующими типам данных столбца?)

Несколько заметок/ресурсов:

  • DacpacExplorer Эда поможет вам просмотреть и понять код.
  • Дэйв Баллантайн только что добавил поддержку SQLDOM в DacpacExplorer. Это не только поможет вам увидеть, какие утверждения вам нужно сопоставить в посетителе, вы также должны посмотреть, как они используют loadAsScriptBackedModel (см. ="nofollow noreferrer">этот коммит), чтобы убедиться, что у вас есть полный AST для тела процедуры. Без этого вы бы просто получили тело как один объект SqlScript, который вам не очень нужен.
  • Другими примерами шаблона посетителя являются TSqlSmells Дейва и DacExtensions проект
  • Твиттер — это простой способ связаться с Эдом, Дэйвом и мной, если вы заблокированы :-)
person Kevin Cunnane    schedule 10.04.2015
comment
Хорошо, я приближаюсь. Теперь я понимаю, что мне нужно было добавить свои таблицы в модель, чтобы они отображались как BodyDependency для процедуры. - person adam0101; 10.04.2015
comment
Ваш ответ действительно помог указать мне правильное направление, но я не могу заставить какие-либо объекты SelectStatement отображаться в моем посетителе. Я создал дополнительный вопрос здесь. Не могли бы вы взглянуть? - person adam0101; 11.04.2015