基于AScript的SQL脚本语言发布啦!

[复制链接]
发表于 2026-6-9 01:37:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
说到执办法态脚本,大多使用Lua、Python、JS等语言,为什么没有SQL动态脚本语言呢?如今它来了!
AScript是一个开源的C#动态脚本分析实行引擎,支持扩展多种脚本语言,2026年6月8日正式发布了SQL脚本语言AScript.Lang.Sql,快来试试吧!
一、先容

支持SqlServer/MySql根本语法和数据范例:

  • 支持SELECT查询语法:FROM/WHERE/LEFT JOIN/RIGHT JOIN/INNER JOIN/GROUP BY/ORDER BY/LIMIT
  • 支持INSERT插入语法
  • 支持UPDATE修改语法
  • 支持DELETE删除语法
  • 支持创建存储过程:Sqlserver/MySql语法都支持
  • 支持创建表
  • 支持界说变量
  • 字段名、关键字不区分巨细写
  • 支持调用外部方法和变量
  • 已内置常用数据范例:tinyint/smallint/int/bigint/decimal/float/real/double/bit/char/nchar/varchar/nvarchar/text/datetime
不支持:

  • 存储过程暂不支持OUT参数
  • SELECT查询不支持*号
  • SELECT查询不支持聚合函数
二、安装
  1. 1 install-package AScript
  2. 2 install-package AScript.Lang.Sql
复制代码
三、使用分析

1、注册语言
  1. 1 Script.Langs.Set("sql", SqlLang.Instance);
  2. 2 // 可全局设置为默认语言
  3. 3 // Script.Langs.Set("sql", SqlLang.Instance, setDefault: true);
复制代码
2、单表查询


  • select多个字段,天生匿名范例
  1. 1 var s = @"select Name, Age from list where age=10";
  2. 2 var list = new[] { new Person("tom", 15), new Person("jim", 10), new Person("san", 20), new Person("qin", 10) };
  3. 3 var script = new Script();
  4. 4 script.Context.Langs = new[] { "sql" };
  5. 5 script.Context.SetVar("list", list);
  6. 6 var result = script.Eval<IEnumerable<dynamic>>(s).ToList();
  7. 7 Assert.AreEqual(2, result.Count);
  8. 8 Assert.AreEqual("jim", result[0].Name);
  9. 9 Assert.AreEqual(10, result[0].Age);
  10. 10 Assert.AreEqual("qin", result[1].Name);
  11. 11 Assert.AreEqual(10, result[1].Age);
复制代码

  • select一个字段
  1. 1 var s = @"select Name from list where age=10";
  2. 2 var list = new[] { new Person("tom", 15), new Person("jim", 10), new Person("san", 20), new Person("qin", 10) };
  3. 3 var script = new Script();
  4. 4 script.Context.Langs = new[] { "sql" };
  5. 5 script.Context.SetVar("list", list);
  6. 6 var result = script.Eval<IEnumerable<string>>(s).ToList();
  7. 7 Assert.AreEqual(2, result.Count);
  8. 8 Assert.AreEqual("jim", result[0]);
  9. 9 Assert.AreEqual("qin", result[1]);
复制代码
3、单独from语句
  1. 1 var s = @"from list where age=10";
  2. 2 var list = new[] { new Person("tom", 15), new Person("jim", 10), new Person("san", 20), new Person("qin", 10) };
  3. 3 var script = new Script();
  4. 4 script.Context.Langs = new[] { "sql" };
  5. 5 script.Context.SetVar("list", list);
  6. 6 var result = script.Eval<IEnumerable<Person>>(s).ToList();
  7. 7 Assert.AreEqual(2, result.Count);
  8. 8 Assert.AreEqual("jim", result[0].Name);
  9. 9 Assert.AreEqual(10, result[0].Age);
  10. 10 Assert.AreEqual("qin", result[1].Name);
  11. 11 Assert.AreEqual(10, result[1].Age);
复制代码
4、多表查询
  1. 1 string s = @"
  2. 2 var q1 = new[] { new Person('tom', 20), new Person('jim', 25), new Person('san', 18), new Person('kit', 30) }.AsQueryable();
  3. 3 var q2 = new[] { new AddressInfo('jim', 'a'), new AddressInfo('cc', 'b'), new AddressInfo('tom', 'c'), new AddressInfo('ee', 'd') }.AsQueryable();
  4. 4 @lang sql
  5. 5 select a.Name, a.Age, b?.Address, case a.Age when 25 then 1 else 2 end as Level
  6. 6 from q1 as a
  7. 7 left join q2 as b on a.Name = b.UserName
  8. 8 where a.age > 22
  9. 9 order by a.age desc
  10. 10 ";
  11. 11 var script = new Script();
  12. 12 script.Context.AddType<Person>();
  13. 13 script.Context.AddType();
  14. 14 var list = script.Eval<IEnumerable<dynamic>>(s).ToList();
  15. 15 Assert.AreEqual(2, list.Count);
  16. 16 Assert.AreEqual("kit", list[0].Name);
  17. 17 Assert.AreEqual(30, list[0].Age);
  18. 18 Assert.AreEqual(2, list[0].Level);
  19. 19 Assert.IsNull(list[0].Address);
  20. 20 Assert.AreEqual("jim", list[1].Name);
  21. 21 Assert.AreEqual(25, list[1].Age);
  22. 22 Assert.AreEqual("a", list[1].Address);
  23. 23 Assert.AreEqual(1, list[1].Level);
复制代码
5、INSERT

实行insert语句返回插入纪录的数目。
  1. 1 var s = @"insert into list (Name, Age) values ('tom', 20), ('jim', 25)";
  2. 2 var list = new List<Person>();
  3. 3 var script = new Script();
  4. 4 script.Context.Langs = new[] { "sql" };
  5. 5 script.Context.SetVar("list", list);
  6. 6 Assert.AreEqual(2, script.Eval(s));
  7. 7 Assert.AreEqual(2, list.Count);
  8. 8 Assert.AreEqual("tom", list[0].Name);
  9. 9 Assert.AreEqual(20, list[0].Age);
  10. 10 Assert.AreEqual("jim", list[1].Name);
  11. 11 Assert.AreEqual(25, list[1].Age);
复制代码
6、UPDATE

实行update语句返回修改纪录的数目。
  1. 1 var s = @"update list set Age=28 where Age<25";
  2. 2 var list = new List<Person>
  3. 3 {
  4. 4     new Person("jim", 18),
  5. 5     new Person("tom", 20),
  6. 6     new Person("lily", 30)
  7. 7 };
  8. 8 var script = new Script();
  9. 9 script.Context.Langs = new[] { "sql" };
  10. 10 script.Context.SetVar("list", list);
  11. 11 var count = (int)script.Eval(s);
  12. 12 Assert.AreEqual(2, count);
  13. 13 Assert.AreEqual(28, list[0].Age);
  14. 14 Assert.AreEqual(28, list[1].Age);
  15. 15 Assert.AreEqual(30, list[2].Age);
复制代码

  • 复杂示例:
  1. 1 var s = @"delete from list where Age<25";
  2. 2 var list = new List<Person>
  3. 3 {
  4. 4     new Person("jim", 18),
  5. 5     new Person("tom", 20),
  6. 6     new Person("lily", 30)
  7. 7 };
  8. 8 var script = new Script();
  9. 9 script.Context.Langs = new[] { "sql" };
  10. 10 script.Context.SetVar("list", list);
  11. 11 var count = (int)script.Eval(s);
  12. 12 Assert.AreEqual(2, count);
  13. 13 Assert.AreEqual(1, list.Count);
  14. 14 Assert.AreEqual("lily", list[0].Name);
复制代码
12、SQL to LINQ

项目中我们经常使用LINQ to SQL,假如反过来SQL to LINQ是啥样呢?
  1. 1 var s = @"
  2. 2 CREATE PROCEDURE AddPerson
  3. 3     @name VARCHAR,
  4. 4     @age INT
  5. 5 AS
  6. 6 BEGIN
  7. 7     INSERT INTO list (name, age) VALUES(@name, @age)
  8. 8 END
  9. 9 EXEC AddPerson 'tom', 20
  10. 10 ";
  11. 11 var list = new List<Person>();
  12. 12 var script = new Script();
  13. 13 script.Context.Langs = new[] { "sql" };
  14. 14 script.Context.SetVar("list", list);
  15. 15 Assert.AreEqual(1, script.Eval(s));
  16. 16 Assert.AreEqual(1, list.Count);
  17. 17 Assert.AreEqual("tom", list[0].Name);
  18. 18 Assert.AreEqual(20, list[0].Age);
复制代码
我们通过SQL脚原来使用DbContext,实现SQL to LINQ,再由LINQ转SQL(EF Core/FreeSql/SqlSugar等ORM)实行数据库查询使用。
天生的SQL语句如下:
  1. 1 var s = @"
  2. 2 CREATE PROCEDURE AddPerson(@name VARCHAR, @age INT)
  3. 3 BEGIN
  4. 4     DECLARE @name2 VARCHAR
  5. 5     DECLARE @age2 INT
  6. 6     SET @name2 = @name + '2'
  7. 7     SET @age2 = @age + 10
  8. 8     INSERT INTO list (name, age) VALUES(@name, @age),(@name2, @age2)
  9. 9 END
  10. 10 CALL AddPerson('tom', 20)";
  11. 11 var list = new List<Person>();
  12. 12 var script = new Script();
  13. 13 script.Context.Langs = new[] { "sql" };
  14. 14 script.Context.SetVar("list", list);
  15. 15 Assert.AreEqual(2, script.Eval(s));
  16. 16 Assert.AreEqual(2, list.Count);
  17. 17 Assert.AreEqual("tom", list[0].Name);
  18. 18 Assert.AreEqual(20, list[0].Age);
  19. 19 Assert.AreEqual("tom2", list[1].Name);
  20. 20 Assert.AreEqual(30, list[1].Age);
复制代码
固然,也可以使用SQL脚本对DbContext举行新增、修改、删除使用,同上面的INSERT/UPDATE/DELETE示例。
四、应用场景

1)前端动态查询条件和排序方式:
将前端传过来的条件和排序拼接为SQL字符串,然后天生Lambda表达式,如下:
[code] 1 // 前端传name、op(=,>,
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表