Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Кодогенератор/шаблонизатор  [new]
tunknown
Member

Откуда:
Сообщений: 775
Существует ли кодогенератор/шаблонизатор для t-sql?
Нужен для runtime, т.е. для динамического sql, а не для препроцессинга. Чтобы шаблоны можно было хранить отдельно от кода и заполнять не вручную.

Что-то похоже в других системах, но для препроцессинга:
Microsoft t4
Варианты для oracle
Заявка в oracle
реализация plgen, документация в syntax.htm
15 мар 17, 00:22    [20295774]     Ответить | Цитировать Сообщить модератору
 Re: Кодогенератор/шаблонизатор  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
tunknown,

генерируйте запросы клиентом. Не путайте сервер баз данных с сервером приложений...
15 мар 17, 11:28    [20296915]     Ответить | Цитировать Сообщить модератору
 Re: Кодогенератор/шаблонизатор  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5489
tunknown
Существует ли кодогенератор/шаблонизатор для t-sql?
Нужен для runtime, т.е. для динамического sql, а не для препроцессинга. Чтобы шаблоны можно было хранить отдельно от кода и заполнять не вручную.

Что-то похоже в других системах, но для препроцессинга:
Microsoft t4
Варианты для oracle
Заявка в oracle
реализация plgen, документация в syntax.htm
Есть разные ORM, типа хибернейта. Они сами генерят динамический sql.
15 мар 17, 11:47    [20297054]     Ответить | Цитировать Сообщить модератору
 Re: Кодогенератор/шаблонизатор  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
tunknown,

Используйте NVelocity. Вот пример из моего кода.

+
INSERT INTO @Action (action,
DELETED_RV, INSERTED_RV,
#ListKeyFields("" " ")
)
SELECT ''Insert'' AS action,
NULL AS DELETED_RV, INSERTED_RV,
#ListKeyFields("" " ")
FROM
(
UPDATE target
SET target.DELETED = 1
OUTPUT
INSERTED.RV AS INSERTED_RV
#foreach( $name in $x.Vs("/*/COLUMNS/COLUMN[@PK='true']/@COLUMN_NAME") )
,INSERTED.[$name]
#end
FROM $TargetTable target
INNER JOIN #DeletedData_${BaseName} source ON
#set($and = "")
#foreach( $name in $x.Vs("/*/COLUMNS/COLUMN[@PK='true']/@COLUMN_NAME") )
${and}target.[$name] = source.[$name]
#set($and = "AND ")
#end
WHERE
target.DELETED = 0
) source;

INSERT INTO [Log].[StageLog]([TABLE_SCHEMA],[TABLE_NAME],[ACTION],[CNT],LoadSeq,LoadStart,LoadEnd)
SELECT N''$TargetSchema'', N''${BaseName}'', ''UPDATE FROM #DeletedData'', @@ROWCOUNT, @LoadSeq, @LoadStart, NULL;

END


Набор команд простой (if for set) Позволяет генерить код. Есть макросы.
15 мар 17, 12:00    [20297148]     Ответить | Цитировать Сообщить модератору
 Re: Кодогенератор/шаблонизатор  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
a_voronin,

http://nvelocity.sourceforge.net/
15 мар 17, 12:10    [20297209]     Ответить | Цитировать Сообщить модератору
 Re: Кодогенератор/шаблонизатор  [new]
tunknown
Member

Откуда:
Сообщений: 775
Dmitry V. Liseev
Есть разные ORM, типа хибернейта. Они сами генерят динамический sql.
Как я понимаю, динамический он только на sql клиенте, где ORM, но на sql сервер отправляется обычный sql. Нужен динамический на сервере. exec или sp_executesql
15 мар 17, 15:49    [20298572]     Ответить | Цитировать Сообщить модератору
 Re: Кодогенератор/шаблонизатор  [new]
tunknown
Member

Откуда:
Сообщений: 775
a_voronin
http://nvelocity.sourceforge.net/
как я понял, на сервер отправляется готовый запрос?
15 мар 17, 16:08    [20298693]     Ответить | Цитировать Сообщить модератору
 Re: Кодогенератор/шаблонизатор  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
tunknown
a_voronin
http://nvelocity.sourceforge.net/
как я понял, на сервер отправляется готовый запрос?


NVelocity генерить код. Он ничего про сервера не знает. Ему на вход, шаблон, метаданные и на выходе код. А двльше, делайте с этим кодом что хотите.

Можно это все в CLR функцию при желании обернуть.
15 мар 17, 17:22    [20298995]     Ответить | Цитировать Сообщить модератору
 Re: Кодогенератор/шаблонизатор  [new]
tunknown
Member

Откуда:
Сообщений: 775
a_voronin
Можно это все в CLR функцию при желании обернуть.
Это уже интереснее. Есть примеры?
15 мар 17, 17:52    [20299116]     Ответить | Цитировать Сообщить модератору
 Re: Кодогенератор/шаблонизатор  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
tunknown
a_voronin
Можно это все в CLR функцию при желании обернуть.
Это уже интереснее. Есть примеры?


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

+
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using NVelocity;
using NVelocity.App;

namespace StarGeneratorLib.Generator
{
    public static class NVelocityInit
    {
        /// <summary>
        /// Инициализирует пакет Velocity 
        /// </summary>
        public static void Init()
        {
            try
            {
                Velocity.Init();
            }
            catch (Exception e)
            {
                HandleError(string.Format("Problem initializing Velocity : {0} {1}", e.Message, e.StackTrace));
            }
        }

        /// <summary>
        /// Осуществляет генерацию по шаблону из файла 
        /// </summary>
        /// <param name="templateFileName"></param>
        /// <param name="context"></param>
        /// <param name="writer"></param>
        public static void RunTemplate(string templateFileName, VelocityContext context, StringWriter writer)
        {
            try
            {
                Velocity.MergeTemplate(templateFileName, "UTF-8", context, writer);
            }
            catch (Exception e)
            {
                HandleError(string.Format("Problem merging template : {0} {1}", e.Message, e.StackTrace));
                throw; 
            }
        }

        /// <summary>
        /// Создет VelocityContext
        /// </summary>
        /// <returns></returns>
        public static VelocityContext GetContext()
        {
            var context= new VelocityContext();
            context.Put("DefaultTablePartition", "PRIMARY");
            context.Put("DefaultIndexPartition", "PRIMARY");
            return context; 
        }

        private static void HandleError(string buffer)
        {
            System.Console.Out.WriteLine(buffer);
        }
    }
}

            VelocityContext context = NVelocityInit.GetContext();
            using (StringWriter writer = new StringWriter(sb))
            {
                context.Put("x", new X(_Metadata));
                NVelocityInit.RunTemplate(@"MsSqlTemplates\LoadStageDtsx.vm", context, writer);
            }


Моя рекомендации состоит в следующем: для генерации SQL скриптов удобно использовать шаблонизатор NVelovity. А вот техническая реализация этого -- подходящая конкретно для вашего проекта должна появиться благодаря вашим усилиям.
16 мар 17, 15:04    [20302443]     Ответить | Цитировать Сообщить модератору
 Re: Кодогенератор/шаблонизатор  [new]
tunknown
Member

Откуда:
Сообщений: 775
a_voronin,

Спасибо.
16 мар 17, 16:58    [20302997]     Ответить | Цитировать Сообщить модератору
 Re: Кодогенератор/шаблонизатор  [new]
dies irae
Member

Откуда:
Сообщений: 78
тут у меня на днях аналогичная задача встала...
и в результате появилась безумная идея использовать Ruby on Rails.. тут тебе и ORM для забора данных из базы, и .erb шаблонизатор и вся мощь языка ruby.
Как альтернативу можно рассмотреть аналогичные фреймворки для всяких там php с java, ведь вэб-разработка - это по сути мощный шаблонизатор
16 мар 17, 18:01    [20303247]     Ответить | Цитировать Сообщить модератору
 Re: Кодогенератор/шаблонизатор  [new]
tunknown
Member

Откуда:
Сообщений: 775
dies irae,

Мне нужен для sql runtime, т.е. для динамического sql. Если только обернуть в CLR.
16 мар 17, 18:03    [20303256]     Ответить | Цитировать Сообщить модератору
 Re: Кодогенератор/шаблонизатор  [new]
dies irae
Member

Откуда:
Сообщений: 78
tunknown
dies irae,

Мне нужен для sql runtime, т.е. для динамического sql. Если только обернуть в CLR.


а если нагенерить хранимых процедур по шаблонам, а входные данные либо через параметры передавать, либо через #таблицы?
такая структура будет полегче в поддержке.
или вам прямо сами шаблоны нужно будет в динамике строить?
16 мар 17, 18:52    [20303434]     Ответить | Цитировать Сообщить модератору
 Re: Кодогенератор/шаблонизатор  [new]
tunknown
Member

Откуда:
Сообщений: 775
dies irae
или вам прямо сами шаблоны нужно будет в динамике строить?

Нужно выполнять в хранимой процедуре через exec/sp_executesql запросы, сгенерированные по шаблонам.
16 мар 17, 19:03    [20303466]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить