正则表达式非常好,但在数据库中就是没有,但可以通过程序集方式扩展 先编写一个dll,标量函数很好写,表值函数麻烦一点 下面是C#代码 using System; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServ
正则表达式非常好,但在数据库中就是没有,但可以通过程序集方式扩展
先编写一个dll,标量函数很好写,表值函数麻烦一点
下面是C#代码
<span>using</span><span> System; </span><span>using</span><span> System.Data; </span><span>using</span><span> System.Data.SqlClient; </span><span>using</span><span> System.Data.SqlTypes; </span><span>using</span><span> Microsoft.SqlServer.Server; </span><span>using</span><span> System.Text.RegularExpressions; </span><span>using</span><span> System.Collections; </span><span>public</span> <span>partial</span> <span>class</span><span> RegExpFunctions {</span>
[SqlFunction(
DataAccess = DataAccessKind.Read,
FillRowMethodName = "MatchsFun_FillRow",
TableDefinition = "pos int,match NVARCHAR(500)")]
public static IEnumerable MatchsFun(string input, string patten)
{
MatchCollection mc;
Regex r = new Regex(patten);
mc = r.Matches(input);
return mc;
}
public static void MatchsFun_FillRow(object mc,out int pos,out SqlString sqlmatch)
{
Match it = (Match)mc;
pos = it.Index;
sqlmatch = it.Value;
}
};
程序集名称是RegulerExp2
代码中有几点解释一下:
(1)表值函数必须是IEnumerable,简单讲是必须有这个接口的类,MatchCollection就具有这个接口;
(2)必须提供一个回调函数,在函数属性FillRowMethodName = "MatchsFun_FillRow"中指明,这个函数负责填充数据,
public static void MatchsFun_FillRow(object mc,out int pos,out SqlString sqlmatch)
{
Match it = (Match)mc;
pos = it.Index;
sqlmatch = it.Value;
}
这里的object mc是什么呢?
我们可以想象一下遍历
foreach (Match it in mc)
{
}
这里的object mc就是foreach里的Match it。
然后数据库把out int pos,out SqlString sqlmatch这两个量取出去放进表里。
下一步是添加程序集
第一步是把数据库的clr打开,不细说,自己网上查
第二步添加程序集
第三步,写一个数据库表值函数包装
<span>create</span> <span>FUNCTION</span> <span>[</span><span>dbo</span><span>]</span>.<span>[</span><span>MatchList</span><span>]</span>(<span>@input</span> <span>[</span><span>nvarchar</span><span>]</span>(<span>1000</span>), <span>@patten</span> <span>[</span><span>nvarchar</span><span>]</span>(<span>1000</span><span>)) </span><span>RETURNS</span> <span>TABLE</span><span> ( pos </span><span>int</span>,<span>[</span><span>match</span><span>]</span> <span>[</span><span>nvarchar</span><span>]</span>(<span>500</span>) <span>NULL</span><span> ) </span><span>WITH</span> <span>EXECUTE</span> <span>AS</span><span> CALLER </span><span>AS</span><span> EXTERNAL NAME </span><span>[</span><span>RegulerExp2</span><span>]</span>.<span>[</span><span>RegExpFunctions</span><span>]</span>.<span>[</span><span>MatchsFun</span><span>]</span>
可以了。
前面写了一个小示例,大家好像没兴趣,写一个实用点的例子吧。数据库中没有split函数,用正则表达式就很容易了
<span>select</span> match <span>from</span> dbo.MatchList(<span>'</span><span>1,2,4,12,24,41</span><span>'</span>,<span>'</span><span>(?<span>'</span>)</span>
结果为
如果以一个存储过程方式
C#代码为
<span>[Microsoft.SqlServer.Server.SqlProcedure] </span><span>public</span> <span>static</span> <span>void</span> Matches(<span>string</span> input, <span>string</span><span> patten) { </span><span>//</span><span>像构造Table一样来构造SqlDataRecord,其中SqlMetaData类似DataColumn</span> SqlDataRecord dataRecord = <span>new</span> SqlDataRecord(<span>new</span><span> SqlMetaData[] { </span><span>new</span> SqlMetaData(<span>"</span><span>ID</span><span>"</span><span>, SqlDbType.Int), </span><span>new</span> SqlMetaData(<span>"</span><span>index</span><span>"</span><span>, SqlDbType.Int), </span><span>new</span> SqlMetaData(<span>"</span><span>match</span><span>"</span>, SqlDbType.NVarChar,<span>100</span><span>) }); </span><span>//</span><span>开始填充</span> <span> SqlContext.Pipe.SendResultsStart(dataRecord); MatchCollection mc; Regex r </span>= <span>new</span><span> Regex(patten); mc </span>=<span> r.Matches(input); </span><span>for</span> (<span>int</span> i = <span>0</span>; i ) { <span>//</span><span>SqlDataRecord.SetString类似DataRow的功能,像Table中填充值</span> dataRecord.SetInt32(<span>0</span><span>, i); dataRecord.SetInt32(</span><span>1</span><span>, mc[i].Index); dataRecord.SetString(</span><span>2</span><span>, mc[i].Value); </span><span>//</span><span>通过SendResultsRow把数据填充到Table,相关于Table.Rows.Add(DataRow);</span> <span> SqlContext.Pipe.SendResultsRow(dataRecord); } </span><span>//</span><span>填充结束,返回结果集</span> <span> SqlContext.Pipe.SendResultsEnd(); }</span>
数据库端写一个存储过程包装
<span>CREATE</span> <span>PROCEDURE</span> <span>[</span><span>dbo</span><span>]</span>.<span>[</span><span>Macths</span><span>]</span> <span>@input</span> <span>[</span><span>nvarchar</span><span>]</span>(<span>1000</span><span>), </span><span>@patten</span> <span>[</span><span>nvarchar</span><span>]</span>(<span>1000</span><span>) </span><span>WITH</span> <span>EXECUTE</span> <span>AS</span><span> CALLER </span><span>AS</span><span> EXTERNAL NAME </span><span>[</span><span>RegulerExp</span><span>]</span>.<span>[</span><span>RegulerExp</span><span>]</span>.<span>[</span><span>Matches</span><span>]</span>
别的一样
运行
<span>exec</span> dbo.Macths <span>'</span><span>1,2,4,12,24,41</span><span>'</span>,<span>'</span><span>(?<span>'</span></span>
结果为
其他标量函数很简单,自己百度,类似

MySQL适合初学者学习数据库技能。1.安装MySQL服务器和客户端工具。2.理解基本SQL查询,如SELECT。3.掌握数据操作:创建表、插入、更新、删除数据。4.学习高级技巧:子查询和窗口函数。5.调试和优化:检查语法、使用索引、避免SELECT*,并使用LIMIT。

MySQL通过表结构和SQL查询高效管理结构化数据,并通过外键实现表间关系。1.创建表时定义数据格式和类型。2.使用外键建立表间关系。3.通过索引和查询优化提高性能。4.定期备份和监控数据库确保数据安全和性能优化。

MySQL是一个开源的关系型数据库管理系统,广泛应用于Web开发。它的关键特性包括:1.支持多种存储引擎,如InnoDB和MyISAM,适用于不同场景;2.提供主从复制功能,利于负载均衡和数据备份;3.通过查询优化和索引使用提高查询效率。

SQL用于与MySQL数据库交互,实现数据的增、删、改、查及数据库设计。1)SQL通过SELECT、INSERT、UPDATE、DELETE语句进行数据操作;2)使用CREATE、ALTER、DROP语句进行数据库设计和管理;3)复杂查询和数据分析通过SQL实现,提升业务决策效率。

MySQL的基本操作包括创建数据库、表格,及使用SQL进行数据的CRUD操作。1.创建数据库:CREATEDATABASEmy_first_db;2.创建表格:CREATETABLEbooks(idINTAUTO_INCREMENTPRIMARYKEY,titleVARCHAR(100)NOTNULL,authorVARCHAR(100)NOTNULL,published_yearINT);3.插入数据:INSERTINTObooks(title,author,published_year)VA

MySQL在Web应用中的主要作用是存储和管理数据。1.MySQL高效处理用户信息、产品目录和交易记录等数据。2.通过SQL查询,开发者能从数据库提取信息生成动态内容。3.MySQL基于客户端-服务器模型工作,确保查询速度可接受。

构建MySQL数据库的步骤包括:1.创建数据库和表,2.插入数据,3.进行查询。首先,使用CREATEDATABASE和CREATETABLE语句创建数据库和表,然后用INSERTINTO语句插入数据,最后用SELECT语句查询数据。

MySQL适合初学者,因为它易用且功能强大。1.MySQL是关系型数据库,使用SQL进行CRUD操作。2.安装简单,需配置root用户密码。3.使用INSERT、UPDATE、DELETE、SELECT进行数据操作。4.复杂查询可使用ORDERBY、WHERE和JOIN。5.调试需检查语法,使用EXPLAIN分析查询。6.优化建议包括使用索引、选择合适数据类型和良好编程习惯。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

禅工作室 13.0.1
功能强大的PHP集成开发环境

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

Dreamweaver CS6
视觉化网页开发工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境