Язык, который компилируется в t-sql

Я пишу много t-sql на своей работе, и часто мне хотелось бы, чтобы были какие-то доступные расширения (например, что-то вроде TypeScript для Javascript - вы можете создавать классы и весь этот объектно-ориентированный материал, и он просто компилируется в стандартный Javascript ).

Краткий пример того, что я хотел бы иметь (семантика, конечно, должна быть улучшена):

-- Input:
def $t sysname
$t = 'Table1'
select * from $t
-- Output:
select * from Table1

-- Input (issues: remove last comma, newline characters):
def $t sysname
set $t = 'Table1'
;with Units as (select distinct Unit from $t),
[repeat @i; i=1; i<4]S$i as (select Unit, count(*) C from $t where T = $i group by Unit),[endrepeat]
select distinct [repeat (@i; i=1; i<4)]isnull(S$i.C, 0) C$i,[endrepeat]
from Units u
    [repeat @i; i=1; i<4]left join S$i on (u.Unit = S$i.Unit)[endrepeat]
group by [repeat @i; i=1; i<4]S$i.C,[endrepeat]
order by [repeat $i; i=4; i>0]S$i.C desc,[endrepeat]
-- Output:
;with Units as (select distinct Unit from Table1),
S1 as (select Unit, count(*) C from Table1 where T = 1 group by Unit),
S2 as (select Unit, count(*) C from Table1 where T = 2 group by Unit),
S3 as (select Unit, count(*) C from Table1 where T = 3 group by Unit)
select distinct isnull(S1.C, 0) C1, isnull(S2.C, 0) C2, isnull(S3.C, 0) C3
from Units u
    left join S1 on (u.Unit = S1.Unit)
    left join S2 on (u.Unit = S2.Unit)
    left join S3 on (u.Unit = S3.Unit)
group by S1.C, S2.C, S3.C
order by S3.C desc, S2.C desc, S1.C desc

-- Input (sq = singlequotes):
declare @sql varchar(max), @year int
set @year = 2012
set @sql = [sq]
select JobId, InventoryItem
from openquery(MyLinkedServer, '
    select JobId, InventoryItem
    from Jobs
    where year(Created) = {@year}
        and Type <> {TypeA}
') x
[endsq]
exec @sql
-- Output:
declare @sql varchar(max)
declare @year int
set @year = 2012
set @sql = '
    select  JobID, InventoryItem
    from    openquery (MyLinkedServer, ''
            select  JobID, InventoryItem
            from    XXX.Jobs
            where   year(Created) = ' + convert(varchar, @year) + '
                    and Type <> ''''TypeA''''
            order by "Created" desc
    '') x
'
exec @sql

Похоже, мне нужно было бы написать свой собственный DSL, чтобы реализовать это, но я никогда не использовал его раньше, поэтому любые идеи более чем приветствуются. Будет ли пакет SDK визуализации и моделирования Visual Studio (VMSDK) правильным выбором для такого рода проектов? Насколько это станет сложным? :)

Изменить - было предложено ORM, но это будет запускаться напрямую из SSMS, а не из такого языка, как C # или java ... Я имею в виду, что не будет никаких объектов и прочего, только запросы. Я удалил тег C #, потому что он вводил в заблуждение. Идея больше в направлении плагина SSMS.


person sventevit    schedule 01.03.2013    source источник
comment
То, что вы ищете, называется ORM. Их много для .NET и других.   -  person System Down    schedule 02.03.2013
comment
Чего ждать? Разве не для этого нужен ORM? LINQ и nHibernate - это те, за которые я могу поручиться, хотя предпочитаю первое.   -  person RandomUs1r    schedule 02.03.2013
comment
Я думаю, что сама идея блестящая, мне нравится SQL как язык, ориентированный на данные, но он мог бы быть намного лучше, если бы к нему добавили немного синтаксического сахара. Жаль, что идея BQL не получила дальнейшего развития   -  person Roman Pekar    schedule 24.10.2017


Ответы (4)


Возможно, спецификация BQL отвечает всем требованиям? (см. ссылку на спецификацию)

Для JavaScript есть CoffeeScript, Dart, Typescript и т. Д. Есть LESS и SCSS для CSS.

Почему не что-нибудь для SQL?

Итак, я сыграл адвоката дьявола и сказал: «Что, если бы SQL был целью компиляции?»

При этом я обнаружил, что мне нужен язык, который:

  • Строгий надмножество SQL. Это важно, поскольку способствует четкому переходу. Можно постепенно перемещать свою кодовую базу SQL, поскольку весь действительный SQL также действителен на этом языке.
  • Продвигает передовые и эффективные методы SQL
  • Способствует сохранению СУХОГО кода SQL
  • Преобразуется в легко читаемый SQL

http://tech.pro/blog/1917/a-better-query-language-bql-language-specification

person Ben Page    schedule 30.01.2015
comment
github.com/lelandrichardson/BQL - это репозиторий github, связанный с этой страницей (добавляется сюда в случае ссылки -гниль) - person Tim Abell; 19.06.2015
comment
Ссылка в ответе не работает, но вот еще один вразумительный треп. ru / - person Roman Pekar; 24.10.2017

Вы смотрели linqpad. Вы можете написать Linq запрос и увидеть сгенерированный sql

Это не плагин SSMS, а собственное приложение, как SSMS.

LinqPad

LinqPad

person ClearLogic    schedule 02.03.2013

Преобразование реляционной модели (SQL) в объектно-ориентированную (C #, C ++, Java ... и т. Д.) Выполняется с помощью так называемого ORM (объектно-реляционное сопоставление). Вы в основном работаете с объектно-ориентированной моделью, а ORM переводит то, что вы делаете, в SQL. Их сотни, хотя Linq to SQL, nHibernate и Entity Framework - одни из наиболее известных.

person System Down    schedule 01.03.2013

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

  1. Честно говоря, если вам нужны определенные результаты с разными предустановками, я бы предложил просто создавать такие объекты, как представления, функции и процедуры.

  2. Однако, если вы утверждаете, что это просто вещи, которые вы хотите изменить изо дня в день для вызовов кода, вы можете сделать это в параметрах SQL: Template.

.

Затем вы просто быстро нажимаете (2005 и ниже): CTRL + SHIFT + M / (2008 и выше) Alt + Q, затем S по очереди.

Мой вам пример:

Select top 10 *
from <tablename, varchar(128), dbo.orders>

3. Проблема заключается в том, что при их применении время от времени меняется весь код, поэтому мне нравится сторонний инструмент под названием Redgate SQL Prompt. Я в основном создаю сниппеты на лету для мелких вещей, которые являются для меня объектами, а затем просто создаю для них комбинации клавиш. Это здорово, если вы кодируете в SSMS изо дня в день ИМХО. Вы можете навести указатель мыши на объекты и получить содержащиеся в них типы, вы можете настроить форматирование, чтобы выделить блок кода, а затем создать свои собственные принципы форматирования того, как вам нравится форматирование, сами по себе фрагменты делают его стоящим, поскольку они работают намного быстрее, чем родные в 2012 году и лучше, чем хаки вроде получения AutoHotKey.

person djangojazz    schedule 01.03.2013