10

我在工作中编写了很多 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 来实现它,但以前从未使用过它,所以任何想法都更受欢迎。Visual Studio 可视化和建模 SDK (VMSDK) 是否是此类项目的正确选择?它会变得多复杂?:)

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

4

4 回答 4

5

也许 BQL 规范符合要求?(有关规格,请参阅链接)

JavaScript 有 CoffeeScript、Dart、Typescript 等。CSS 有 LESS 和 SCSS。

为什么不适合 SQL 呢?

所以我扮演了魔鬼的拥护者并说:“如果 SQL 是一个编译目标怎么办?”

在这样做的过程中,我发现自己想要一种语言:

  • SQL 的严格超集。这很重要,因为它促进了干净的过渡。可以逐步迁移他们的 SQL 代码库,因为所有有效的 SQL 在这种语言中也是有效的。
  • 促进良好和高效的 SQL 实践
  • 促进保持 SQL 代码干燥
  • 转译成易于阅读的 SQL

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

于 2015-01-30T13:25:04.530 回答
4

Have you looked at linqpad.you can write a Linq query and see the generated sql

Its not a SSMS plugin but an Application of its own just like SSMS.

LinqPad

LinqPad

于 2013-03-02T02:05:05.877 回答
2

根据你所说的你想要标注或代码重用是 . 我可以为您提供一些我在 SQL 中经常使用的东西。

  1. 老实说,如果你想用不同的预设来定义结果,我建议你只创建像视图、函数和过程这样的对象。

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

.

然后您只需快速按(2005 年及以下):CTRL + SHIFT + M /(2008 年及更高)Alt + Q,然后依次按 S。

我给你的例子是:

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

3. 这些问题是,当您有时应用它们时,您会更改整个代码,所以我喜欢名为 Redgate SQL Prompt 的第 3 方工具。我基本上为对我来说是对象的小东西即时创建片段,然后为它们设置关键组合。恕我直言,如果您日复一日地在 SSMS 中编码,那就太好了。您可以将鼠标悬停在对象上并获取它们包含的类型,您可以设置格式以突出显示代码块,然后根据您的格式创建自己的格式原则,仅这些片段就值得拥有,因为它们的工作速度比2012 年的原生版本,比获取 AutoHotKey 之类的黑客要好。

于 2013-03-01T22:27:06.833 回答
2

将关系模型 (SQL) 映射到面向对象的模型 (C#、C++、Java ... 等) 是使用称为 ORM (Object-Relational Mapping) 的东西完成的。您基本上使用 OO 模型,并且 ORM 将您正在做的事情转换为 SQL。那里有数百个,尽管Linq to SQLnHibernateEntity Framework是比较知名的。

于 2013-03-01T20:29:42.680 回答