我有一個關鍵字表,其中包含字段KeywordsEn和KeywordsFr。 我有另一個MediaObjectsMetadata字段值。SQL - 如何驗證一個字段中是否存在至少一個關鍵字列表
我需要檢查「值」字段是否至少包含關鍵字表格中的一個單詞(在關鍵字En或KeywordsFr字段中)。
我想我會用包含這樣的功能,其中@priorityKeywords包含所有KeywordsEn和KeywordsFr用OR連接起來,但後來我在我的字符串超過16000個字符,包含的功能不僅可以讓4000
部分我SP的
SELECT FKMediaObjectId
FROM dbo.gs_MediaObjectMetadata
WHERE UPPER([Description]) = 'KEYWORDS'
AND FKMediaObjectId >=
(SELECT TOP 1 MediaObjectId
FROM dbo.gs_MediaObject
WHERE DateAdded > @lastcheck
ORDER BY MediaObjectId)
AND Contains([Value] , @priorityKeywords);
C#函數生成@priorityKeywords
public static string GetPriorityKeywordsList()
{
string keywordString = String.Empty;
using (IDataReader dr = GetCommandPriorityKeywordsList().ExecuteReader(CommandBehavior.CloseConnection))
{
while (dr.Read())
{
if (keywordString.Length > 0)
{
keywordString += " OR ";
}
// max 4000 chars allowed in COntains sql function of sp
keywordString += "'" + dr["KeywordEn"].ToString() + "' OR '" + dr["KeywordFr"].ToString() + "'";
}
}
return keywordString;
}
什麼解決方案將您推薦我的存儲過程?
編輯(解決方案):
這裏是Andomar提出的解決方案,適用於我的情況:
select *
from gs_MediaObjectMetadata yt
where
UPPER([Description]) = 'KEYWORDS'
AND not exists
(
select *
from dbo.fnSplit(Replace(yt.Value, '''', ''''''), ',') split
where split.item in (select KeywordEn from gs_Keywords) or split.item in (select KeywordFr from gs_Keywords)
)
也許你可以只執行SQL多次,保持你的字符串在4000字符的限制,然後加入結果? – 2012-03-23 13:49:57
我可以,我只想知道是否有一個理想的解決方案,其性能將處於最佳狀態。有很多記錄可以運行這個(它是一個非常大的相冊)... – crichard 2012-03-23 13:53:23