【发布时间】:2012-04-27 18:08:38
【问题描述】:
我有一个用 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,因为据我所知 that would be bad。
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)
...但这听起来也像个肮脏的把戏。
在我看来这应该是一个很常见的情况,我发现很多人过去都遇到过这个问题,但是在谷歌上搜索我找不到一个优雅的解决方案。
有人可以帮忙吗?
【问题讨论】:
-
tags ='A' OR tags='B' 等,是你要找的吗?
-
I don't want to dynamically build the SQL because that would be bad.是什么意思?? -
试试我的解决方案 [在这个问题上][1]。你是对的,这是一个非常普遍的问题。 [1]:stackoverflow.com/questions/10355507/…
-
请提供其他上下文。您是否在使用字符串 SQL 查询、linq to sql 等?网页建立在什么平台上(ASP、APSX、MVC、PHP 等)?另外,是什么让拆分逗号分隔列表成为一种肮脏的把戏?
-
我编辑了问题以提供更多上下文,是的,我正在使用 C#、linq to entity 和 SQL Server 2008 的存储过程;但我觉得我的问题是一般性的,也适用于其他编程框架和数据库。
标签: sql sql-server forms