У меня есть таблица ключевых слов с полями KeywordsEn и KeywordsFr.У меня есть другой MediaObjectsMetadata с полем Значения.
Мне нужно проверить, что поле Значение содержит хотя бы одно из слов из таблицы Ключевые слова (либо в поле KeywordsEn, либо KeywordsFr).
IЯ подумал, что я бы использовал такую функцию Contains, где @priorityKeywords содержит все ключевые слова и ключевые слова, объединенные с OR, но в моей строке более 16000 символов, а функция Contains может разрешить только 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)
)