我需要测试一个字符串(带有完整路径的文件名)是否包含MSSQL中的另一个字符串。
我的脚本需要检查我们要提交的文件是否存在于数据库中特定列下(预挂接脚本)。
我真的无法更改列的数据定义,但我们目前使用的是文本TEXT
,文件由换行符分隔。我尝试使用TSQL函数CONTAINS
,但总体性能不是很好。
将所有数据加载到PHP数组中并在本地进行比较会更好吗?
我不太确定在这里做什么是最好的方式。
更新:数据库中大约有194530行。
在搜索字符串时要记住的主要事项是,您希望限制正在搜索的字符串的长度。现在,您有多个路径+文件名值被塞进一个单行列对中——正如我上面提到的,这是标准化程度很差的(这也是查找时遇到困难的部分原因)。
考虑到您无法真正更改遇到问题的表的模式,一个更好的选择可能是创建一个结构来处理描述存储在某一行中的文件的元数据。
例如,一种选择可能是创建一个包含filename
-rowID
对的表,其中原始表的每一行都链接到该行的TEXT
列中解析出的文件名。这使您可以选择限制搜索,方法是首先在较短的字符串(filename
)上进行查找,然后使用该约束来帮助搜索较少的行,以满足路径+文件名的组合,并获得唯一的结果。
如果有大量名称相同的文件,另一种选择可能是使用原始表中的rowID
来实现哈希索引,并使用CHECKSUM()
或任何可用的哈希函数来实现该行中每个路径+文件名的哈希。
使用这样的"索引"表确实会增加开销:您必须在原始表更新时维护元数据,但这也意味着您要提前完成繁重的工作,并使未来的数据查询速度更快。
使用LIKE
运算符怎么样?你可以做一些类似的事情
SELECT * FROM TABLE WHERE COLUMN LIKE '%' + @FilePath +'%'
如果这不符合您的需求,那么,我同意以编程方式进行此操作可能会更好。问题是SQL使用基于集合的逻辑,所以当您开始做一些更过程化的事情(函数)时,它就会崩溃。显然,运行测试,但通过编程,您应该能够更快地完成这项工作。您可以使用正则表达式或contains,或者php 中最好的东西
我认为这会更快:
SELECT TOP 1 columnname FROM tablename WHERE COLUMN LIKE '%' + @FilePath +'%'