フィールドKeywordsEnとKeywordsFrを持つKeywordsテーブルがあります。 私は値フィールドを持つ別のMediaObjectsMetadataを持っています。SQL - キーワードのリストから少なくとも1つのキーワードがフィールドに存在することを確認する方法
「値」フィールドにキーワードテーブルの単語(KeywordsEnまたはKeywordsFrフィールドのいずれか)が少なくとも1つ含まれていることを確認する必要があります。
は私が@priorityKeywordsはORで連結すべてKeywordsEnとKeywordsFrが含まれています。このような機能を、含まれて使用するだろうと思ったが、その後私は、文字列で16000以上の文字があり、機能のみを許可することができます含まれて4000
@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;
}
を生成し、私の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#関数の
パート私のストアドプロシージャをお勧めしますか?
編集(ソリューション):ここで
が私の状況に適応し、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文字の制限のままにして、結果に加わることができますか? –
私は、パフォーマンスが最高になる理想的なソリューションがあるかどうかを知りたいと思います。これを実行するための多くのレコードがあります(これは非常に大きな写真アルバムです)。 – crichard