2012-03-26 115 views
2

我需要測試一個字符串(具有完整路徑的文件名)是否包含MSSQL中的另一個字符串。什麼是測試MSSQL中字符串是否包含另一個字符串的最有效方法?

我的腳本需要檢查我們即將提交的文件是否存在於特定列(預鉤腳本)下的數據庫中。

我不能真的改變列的數據定義,但我們目前使用文本TEXT和文件被一個新的行字符分隔。我試圖使用TSQL功能CONTAINS,但整體表現並不好。

將一個PHP數組中的所有數據加載到本地進行比較會更好嗎?

我不太清楚在這裏做什麼是最好的方法。

更新:數據庫中有大約194 530行。

+0

什麼版本的MSSQL?2008,2005,2000,7 – RThomas 2012-03-26 17:21:25

+0

該應用程序運行在MSSQL 2000(我知道,這是舊的)。我知道我們還有一個2005盒子,可能我們可以將數據庫移動到該服務器,但我不確定這一點。現在,我想我將不得不面對與MSSQL 2000 :( – 2012-03-26 17:22:52

+0

一些,這是一個有點不清楚:你存儲在一個單一的行列對多個文件名,正確 – lyrisey 2012-03-26 17:46:28

回答

1

主要的事情要記住做通過字符串搜索時是要限制您正在搜索的字符串的長度。現在,您可以將多個路徑+文件名值集合到一個行 - 列對中 - 就像我之前提到的那樣,這是標準化程度很差(並且是您在查找時遇到問題的部分原因)。

鑑於您無法真正更改您遇到問題的表的架構,更好的選擇可能是創建一個結構來處理描述存儲在特定行內的文件的元數據。

例如,一個選擇可能是創建一個包含filename表 - rowID雙,其中原始表的每一行鏈接到解析出來的文件名該行的TEXT列中。通過首先對較短的字符串(filename)進行查找,然後使用該約束來幫助搜索更少數量的行以滿足路徑+文件名組合並獲得唯一結果,可以選擇限制搜索。

如果您有大量的具有相同名稱的文件,另一個選擇可能是實現一個散列索引,使用CHECKSUM()使用從原始表,每個路徑+文件名從該行的哈希rowID S或任何散列函數你有空。

使用像這樣的'索引'表確實會增加開銷:您必須在原始表更新時維護元數據,但這也意味着您要提前完成繁重的工作,數據要快得多。

1

如何使用LIKE運算符?你可以做這樣的

SELECT * FROM TABLE WHERE COLUMN LIKE '%' + @FilePath +'%' 

的東西,如果這個不適合你的需求,那麼,我會同意,編程這樣做可能會更好。問題是SQL使用基於集合的邏輯,所以當你開始做一些更程序化的(函數)時,它就會崩潰。顯然,運行測試,但編程你應該能夠更快地做到這一點。你可以使用正則表達式或含有或任何可能PHP中是最好的

+0

這是我嘗試的第一件事,我個人發現CONTAINS的表演效果更好(也許這只是我......)。此外,我不認爲我們在這一列上都沒有索引。...... – 2012-03-26 17:26:16

+0

@ Pierre-OlivierBourgeois然後,我會同意以編程的方式做到這一點可能會更好。問題是SQL使用基於集合的邏輯,所以當你開始做一些更程序化的(函數)時,它就會崩潰。顯然,運行測試,但編程你應該能夠更快地做到這一點。你可以使用正則表達式或包含或任何可能是最好的PHP內。 – 2012-03-26 17:29:42

+0

這也是我所追求的。但現在的問題是,將所有這些行存儲在PHP中的正確方法是什麼?將它存儲在數組中最終會填滿內存,我錯了嗎? – 2012-03-26 17:32:19

1

我認爲這將是更快:

SELECT TOP 1 columnname FROM tablename WHERE COLUMN LIKE '%' + @FilePath +'%' 
+0

+1爲編輯,但我不認爲它會在實踐中更快。 – JNK 2012-03-26 17:53:08

相關問題