编译为t-sql的语言

时间:2013-03-01 20:18:56

标签: sql-server sql-server-2008 tsql dsl

我在我的工作中编写了很多t-sql并经常希望有一些类型的扩展可用(例如TypeScript就像Javascript一样 - 你可以创建类和所有这些OO的东西,它只是编译标准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来实现这一点,但之前从未使用过,所以任何想法都会受到欢迎。 Visual Studio可视化和建模SDK(VMSDK)是否是这类项目的正确选择?它会变得多么复杂? :)

编辑 - 建议使用ORM,但这可以直接从SSMS运行,而不是从c#或java这样的语言运行...我的意思是,没有对象和东西,只是查询。我删除了c#标签,因为它具有误导性。这个想法更像是SSMS插件的方向。

4 个答案:

答案 0 :(得分:5)

也许BQL规范符合要求? (参见规范链接)

  

JavaScript有CoffeeScript,Dart,Typescript等。有   用于CSS的LESS和SCSS。

     

为什么不用SQL?

     

所以我扮演了魔鬼的拥护者并说:&#34;如果SQL是编译器怎么办?   目标&#34;

     

这样做,我发现自己想要一种语言:

     
      
  • SQL的严格超集。这很重要,因为它可以促进干净   过渡。可以逐步迁移其SQL代码库   因为所有有效的SQL在这种语言中也是有效的。
  •   
  • 宣传优质高效的SQL实践
  •   
  • 促进保持SQL代码DRY
  •   
  • 透明化为易于理解的SQL
  •   

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

答案 1 :(得分:4)

您是否看过linqpad。您可以编写Linq查询并查看生成的sql

它不是SSMS插件,而是像SSMS一样的自己的应用程序。

LinqPad

LinqPad

答案 2 :(得分:3)

使用称为ORM(对象 - 关系映射)的东西来完成将关系模型(SQL)映射到面向对象的模型(C#,C ++,Java ...等)。您基本上使用OO模型,ORM将您正在做的事情转换为SQL。其中有数百个,但Linq to SQLnHibernateEntity Framework是众所周知的。

答案 3 :(得分:2)

根据您所说的内容,您希望有标注或代码重用。我可以为你提供一些我在SQL中使用的东西。

  1. 老实说,如果您想要使用不同的预设定义结果,我建议您只创建视图,函数和过程等对象。

  2. 但是,如果您说这是日复一日的事情,您想要更改代码调用,您可以在SQL中执行这些操作:模板参数。

  3. 然后您快速点击(2005年及以下):CTRL + SHIFT + M /(2008及更高版本)Alt + Q,然后是S连续。

    我的例子是:

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

    3。这些问题的一个原因是你有时会在应用它们时更改整个代码,因此我喜欢名为Redgate SQL Prompt的第三方工具。我基本上是为了对我来说是对象的小东西创建片段然后只为它们提供关键组合。如果您每天都在SSMS中编写SSMS代码,那就太棒了。您可以将鼠标悬停在对象上并获取其包含的类型,您可以设置格式以突出显示代码块,然后根据您的格式创建自己的格式原则,单独使用片段使其值得拥有,因为它们的工作速度比2012年的本地人,比获得AutoHotKey的黑客更好。