C#で開発されたWebアプリケーションがあり、ページにSQLクエリの出力が表示されています。クエリはストアドプロシージャへのlinq呼び出しであり、SQLServer2008を使用しています。
列の1つには、結果行に関連付けられたタグが表示されます。同じページにチェックボックスのリストが表示され、各チェックボックスはタグに対応しています。ユーザーが1つまたは複数のチェックボックスをオンまたはオフにした場合、クエリをフィルタリングします。
私の最も単純なSQLソリューションは、次のように「NOTIN」になります。
select * from [mytable] where [tags] not in ('tag1','tag2, etc...)
FORM POSTを、値がコンマで区切られた文字列に変換するとします。例:
string tags = ParseFormAndConvertCheckBoxToCSV(Page.Request.Form);
string sqlcmd = "select * from [mytable] where [tags] not in (" + tags + ")";
しかし、私が知る限り、それは悪いことになるので、SQLを動的に構築したくありません。
SQLで値のコンマ区切りリストを使用して文字列を分割し、値をメモリ内のテーブルに格納するいくつかの方法を想像できます。
declare @tagscsv nvarchar(MAX)
declare @notags TABLE(Value nvarchar(50))
set @tagscsv = 'taxi,ivf'
Declare @x XML
select @x = cast('<A>'+ replace(@tagscsv,',','</A><A>')+ '</A>' as xml)
insert into @notags
select t.value('.', 'nvarchar(50)') as v from @x.nodes('/A') as x(t)
select * from [mytable] where [tags] not in (select * from @notags)
...しかし、これも汚いトリックのように聞こえます。
私にはこれは非常に一般的な状況であるように見えます、そして私はそこに多くの人々が過去にこの問題に直面したことを理解します、しかしグーグルで検索して私はエレガントな解決策を見つけることができませんでした。
誰でも助けることができますか?