马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
说到执办法态脚本,大多使用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 install-package AScript
- 2 install-package AScript.Lang.Sql
复制代码 三、使用分析
1、注册语言
- 1 Script.Langs.Set("sql", SqlLang.Instance);
- 2 // 可全局设置为默认语言
- 3 // Script.Langs.Set("sql", SqlLang.Instance, setDefault: true);
复制代码 2、单表查询
- 1 var s = @"select Name, Age from list where age=10";
- 2 var list = new[] { new Person("tom", 15), new Person("jim", 10), new Person("san", 20), new Person("qin", 10) };
- 3 var script = new Script();
- 4 script.Context.Langs = new[] { "sql" };
- 5 script.Context.SetVar("list", list);
- 6 var result = script.Eval<IEnumerable<dynamic>>(s).ToList();
- 7 Assert.AreEqual(2, result.Count);
- 8 Assert.AreEqual("jim", result[0].Name);
- 9 Assert.AreEqual(10, result[0].Age);
- 10 Assert.AreEqual("qin", result[1].Name);
- 11 Assert.AreEqual(10, result[1].Age);
复制代码- 1 var s = @"select Name from list where age=10";
- 2 var list = new[] { new Person("tom", 15), new Person("jim", 10), new Person("san", 20), new Person("qin", 10) };
- 3 var script = new Script();
- 4 script.Context.Langs = new[] { "sql" };
- 5 script.Context.SetVar("list", list);
- 6 var result = script.Eval<IEnumerable<string>>(s).ToList();
- 7 Assert.AreEqual(2, result.Count);
- 8 Assert.AreEqual("jim", result[0]);
- 9 Assert.AreEqual("qin", result[1]);
复制代码 3、单独from语句
- 1 var s = @"from list where age=10";
- 2 var list = new[] { new Person("tom", 15), new Person("jim", 10), new Person("san", 20), new Person("qin", 10) };
- 3 var script = new Script();
- 4 script.Context.Langs = new[] { "sql" };
- 5 script.Context.SetVar("list", list);
- 6 var result = script.Eval<IEnumerable<Person>>(s).ToList();
- 7 Assert.AreEqual(2, result.Count);
- 8 Assert.AreEqual("jim", result[0].Name);
- 9 Assert.AreEqual(10, result[0].Age);
- 10 Assert.AreEqual("qin", result[1].Name);
- 11 Assert.AreEqual(10, result[1].Age);
复制代码 4、多表查询
- 1 string s = @"
- 2 var q1 = new[] { new Person('tom', 20), new Person('jim', 25), new Person('san', 18), new Person('kit', 30) }.AsQueryable();
- 3 var q2 = new[] { new AddressInfo('jim', 'a'), new AddressInfo('cc', 'b'), new AddressInfo('tom', 'c'), new AddressInfo('ee', 'd') }.AsQueryable();
- 4 @lang sql
- 5 select a.Name, a.Age, b?.Address, case a.Age when 25 then 1 else 2 end as Level
- 6 from q1 as a
- 7 left join q2 as b on a.Name = b.UserName
- 8 where a.age > 22
- 9 order by a.age desc
- 10 ";
- 11 var script = new Script();
- 12 script.Context.AddType<Person>();
- 13 script.Context.AddType();
- 14 var list = script.Eval<IEnumerable<dynamic>>(s).ToList();
- 15 Assert.AreEqual(2, list.Count);
- 16 Assert.AreEqual("kit", list[0].Name);
- 17 Assert.AreEqual(30, list[0].Age);
- 18 Assert.AreEqual(2, list[0].Level);
- 19 Assert.IsNull(list[0].Address);
- 20 Assert.AreEqual("jim", list[1].Name);
- 21 Assert.AreEqual(25, list[1].Age);
- 22 Assert.AreEqual("a", list[1].Address);
- 23 Assert.AreEqual(1, list[1].Level);
复制代码 5、INSERT
实行insert语句返回插入纪录的数目。- 1 var s = @"insert into list (Name, Age) values ('tom', 20), ('jim', 25)";
- 2 var list = new List<Person>();
- 3 var script = new Script();
- 4 script.Context.Langs = new[] { "sql" };
- 5 script.Context.SetVar("list", list);
- 6 Assert.AreEqual(2, script.Eval(s));
- 7 Assert.AreEqual(2, list.Count);
- 8 Assert.AreEqual("tom", list[0].Name);
- 9 Assert.AreEqual(20, list[0].Age);
- 10 Assert.AreEqual("jim", list[1].Name);
- 11 Assert.AreEqual(25, list[1].Age);
复制代码 6、UPDATE
实行update语句返回修改纪录的数目。- 1 var s = @"update list set Age=28 where Age<25";
- 2 var list = new List<Person>
- 3 {
- 4 new Person("jim", 18),
- 5 new Person("tom", 20),
- 6 new Person("lily", 30)
- 7 };
- 8 var script = new Script();
- 9 script.Context.Langs = new[] { "sql" };
- 10 script.Context.SetVar("list", list);
- 11 var count = (int)script.Eval(s);
- 12 Assert.AreEqual(2, count);
- 13 Assert.AreEqual(28, list[0].Age);
- 14 Assert.AreEqual(28, list[1].Age);
- 15 Assert.AreEqual(30, list[2].Age);
复制代码- 1 var s = @"delete from list where Age<25";
- 2 var list = new List<Person>
- 3 {
- 4 new Person("jim", 18),
- 5 new Person("tom", 20),
- 6 new Person("lily", 30)
- 7 };
- 8 var script = new Script();
- 9 script.Context.Langs = new[] { "sql" };
- 10 script.Context.SetVar("list", list);
- 11 var count = (int)script.Eval(s);
- 12 Assert.AreEqual(2, count);
- 13 Assert.AreEqual(1, list.Count);
- 14 Assert.AreEqual("lily", list[0].Name);
复制代码 12、SQL to LINQ
项目中我们经常使用LINQ to SQL,假如反过来SQL to LINQ是啥样呢?- 1 var s = @"
- 2 CREATE PROCEDURE AddPerson
- 3 @name VARCHAR,
- 4 @age INT
- 5 AS
- 6 BEGIN
- 7 INSERT INTO list (name, age) VALUES(@name, @age)
- 8 END
- 9 EXEC AddPerson 'tom', 20
- 10 ";
- 11 var list = new List<Person>();
- 12 var script = new Script();
- 13 script.Context.Langs = new[] { "sql" };
- 14 script.Context.SetVar("list", list);
- 15 Assert.AreEqual(1, script.Eval(s));
- 16 Assert.AreEqual(1, list.Count);
- 17 Assert.AreEqual("tom", list[0].Name);
- 18 Assert.AreEqual(20, list[0].Age);
复制代码 我们通过SQL脚原来使用DbContext,实现SQL to LINQ,再由LINQ转SQL(EF Core/FreeSql/SqlSugar等ORM)实行数据库查询使用。
天生的SQL语句如下:- 1 var s = @"
- 2 CREATE PROCEDURE AddPerson(@name VARCHAR, @age INT)
- 3 BEGIN
- 4 DECLARE @name2 VARCHAR
- 5 DECLARE @age2 INT
- 6 SET @name2 = @name + '2'
- 7 SET @age2 = @age + 10
- 8 INSERT INTO list (name, age) VALUES(@name, @age),(@name2, @age2)
- 9 END
- 10 CALL AddPerson('tom', 20)";
- 11 var list = new List<Person>();
- 12 var script = new Script();
- 13 script.Context.Langs = new[] { "sql" };
- 14 script.Context.SetVar("list", list);
- 15 Assert.AreEqual(2, script.Eval(s));
- 16 Assert.AreEqual(2, list.Count);
- 17 Assert.AreEqual("tom", list[0].Name);
- 18 Assert.AreEqual(20, list[0].Age);
- 19 Assert.AreEqual("tom2", list[1].Name);
- 20 Assert.AreEqual(30, list[1].Age);
复制代码 固然,也可以使用SQL脚本对DbContext举行新增、修改、删除使用,同上面的INSERT/UPDATE/DELETE示例。
四、应用场景
1)前端动态查询条件和排序方式:
将前端传过来的条件和排序拼接为SQL字符串,然后天生Lambda表达式,如下:
[code] 1 // 前端传name、op(=,>, |