我有一个用 C# 开发的 Web 应用程序,其中一个页面显示 SQL 查询的输出;查询是对存储过程的 linq 调用,我使用的是 SQL Server 2008。
其中一列显示与结果行关联的标签;在同一页面上显示复选框列表,每个复选框对应一个标签,如果用户打开或关闭一个或多个复选框,我想过滤查询。
我最简单的 SQL 解决方案对我们来说是“NOT IN”,如下所示:
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)
...但这听起来也像是一个肮脏的把戏。
对我来说,这看起来应该是一个非常普遍的情况,我发现很多人过去都面临过这个问题,但是在谷歌上搜索我找不到一个优雅的解决方案。
任何人都可以帮忙吗?