sve*_*vit 9 t-sql sql-server dsl sql-server-2008
我在我的工作,写了很多T-SQL的,经常我想会有一些类型的可扩展的(例如像打字稿是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
Run Code Online (Sandbox Code Playgroud)
看起来我需要编写自己的DSL来实现这一点,但之前从未使用它,所以任何想法都更受欢迎.Visual Studio可视化和建模SDK(VMSDK)是否是这类项目的正确选择?它会变得多么复杂?:)
编辑 - 建议使用ORM,但是这将直接从SSMS运行,而不是从c#或java这样的语言运行...我的意思是,没有对象和东西,只是查询.我删除了c#标签,因为它具有误导性.这个想法更多的是SSMS插件的方向.
也许BQL规范符合要求?(参见规范链接)
有JavaScript的CoffeeScript,Dart,Typescript等.CSS有LESS和SCSS.
为什么不用SQL?
所以我扮演了魔鬼的拥护者并说道:"如果SQL是编译目标怎么办?"
在这样做的过程中,我发现自己想要一种语言:
- 严格的SQL超集.这很重要,因为它促进了干净的过渡.由于所有有效的SQL在此语言中也有效,因此可以逐步迁移其SQL代码库.
- 促进优质高效的SQL实践
- 促进保持SQL代码DRY
- 透明化为易于阅读的SQL
http://tech.pro/blog/1917/a-better-query-language-bql-language-specification
将关系模型 (SQL) 映射到面向对象的模型(C#、C++、Java...等)是使用称为 ORM(对象关系映射)的东西来完成的。您基本上使用 OO 模型,ORM 将您所做的事情转换为 SQL。尽管Linq to SQL、nHibernate和Entity Framework是较知名的,但它们有数百种。