Mor*_*sbo 2 sql t-sql sql-server sql-server-2000
我目前正在使用相对较大的SQL Server 2000 DB.它的大小为80 GB,拥有数百万条记录.
我目前需要返回一个包含一系列非法字符中至少一个的名称列表.非法字符只是指由客户定义的任意字符列表.在下面的例子中,我使用问号,分号,句号和逗号作为非法字符列表.
我最初想要做一个与正则表达式一起工作的CLR函数,但是因为它是SQL server 2000,我猜这是不可能的.
目前我这样做了:
select x from users
where
columnToBeSearched like '%?%' OR
columnToBeSearched like '%;%' OR
columnToBeSearched like '%.%' OR
columnToBeSearched like '%,%' OR
otherColumnToBeSearched like '%?%' OR
otherColumnToBeSearched like '%;%' OR
otherColumnToBeSearched like '%.%' OR
otherColumnToBeSearched like '%,%'
Run Code Online (Sandbox Code Playgroud)
现在,我不是一个SQL专家,但我觉得上面的查询效率很低.在具有数百万条记录的表中进行8次多通配符搜索,似乎可能会严重降低系统速度.虽然它似乎在测试服务器上运行良好,但我得到了"这必须完全错误"的氛围.
由于我最终需要在实时生产服务器上执行此脚本,我希望能够获得良好的性能,以免堵塞系统.可能需要稍后扩展该脚本以包含更多非法字符,但这不太可能.
总结一下:我的目标是获取一个记录列表,其中两列中的任何一列都包含客户定义的"非法字符".数据库是实时且庞大的,所以我想要一种有效的方法,因为我相信上面的查询会非常慢.
谁能告诉我实现结果的最佳方法?谢谢!
/莫滕
它没有得到太多使用,但该LIKE语句接受了与Regex类似(但非常简化)的模式.这个链接是它的msdn页面.
在您的情况下,您可以简化为(未经测试):
select x from users
where
columnToBeSearched like '%[?;.,]%' OR
otherColumnToBeSearched like '%[?;.,]%'
Run Code Online (Sandbox Code Playgroud)
另请注意,您可以将LIKE模式创建为变量,从而允许客户定义的部分需求.
另一个主要优化:如果您在用户行上有更新的日期(或时间戳)(对于任何审计历史记录类型的事物),那么您始终可以只查询自上次检查后更新的行.