Asp.net 如何正确编写此数据库搜索查询?

Asp.net 如何正确编写此数据库搜索查询?,asp.net,sql,tsql,search,dotnetnuke,Asp.net,Sql,Tsql,Search,Dotnetnuke,我正在尝试编写一个查询,它将根据许多不同的表单字段搜索数据库。我希望查询按输入的字段过滤,而忽略表单上未输入的任何字段。例如: 表单字段: -项目名称 -项目编号 -项目经理 因此,如果用户为项目名称输入一个“Joe”,那么无论该记录中的其他值是什么,它都应该返回名称字段中带有任何形式“Joe”的所有结果 我一直试图用严格的SQL来实现这一点,但我得到的结果是不正确的(但却是预期的)。我有一些非常重要的问题,如果它们非常牵强,我道歉 第一个查询是使用AND语句为所有条件设置的。我意识到它不起作用

我正在尝试编写一个查询,它将根据许多不同的表单字段搜索数据库。我希望查询按输入的字段过滤,而忽略表单上未输入的任何字段。例如:

表单字段: -项目名称 -项目编号 -项目经理

因此,如果用户为项目名称输入一个“Joe”,那么无论该记录中的其他值是什么,它都应该返回名称字段中带有任何形式“Joe”的所有结果

我一直试图用严格的SQL来实现这一点,但我得到的结果是不正确的(但却是预期的)。我有一些非常重要的问题,如果它们非常牵强,我道歉

第一个查询是使用AND语句为所有条件设置的。我意识到它不起作用,因为数据库中的空值仍然不能被通配符拾取

    <ListDataSource CommandText="
SELECT [surveyid], 
       [projectnumber], 
       [siteno], 
       [person], 
       [subatpdate], 
       [projectname], 
       [priorsurveyor], 
       [siteaddress], 
       [sitecity], 
       [sitestate], 
       [sitezip], 
       [survey], 
       [zoning], 
       [environmental], 
       [emg_projectnumber], 
       [zoning_projectnumber], 
       [surveyor_projectnumber] 
FROM   tblrawprojectdatabase 
WHERE  [projectnumber] LIKE '%' + @projectnumber + '%' 
       AND [siteno] LIKE '%' + @siteno + '%' 
       AND [person] LIKE '%' + @person + '%' 
       AND [subatpdate] LIKE '%' + @subatpdate + '%' 
       AND [projectname] LIKE '%' + @projectname + '%' 
       AND [priorsurveyor] LIKE '%' + @priorsurveyor + '%' 
       AND [siteaddress] LIKE '%' + @siteaddress + '%' 
       AND [sitecity] LIKE '%' + @sitecity + '%' 
       AND [sitestate] LIKE '%' + @sitestate + '%' 
       AND [sitezip] LIKE '%' + @sitezip + '%' 
       AND [survey] LIKE '%' + @survey + '%' 
       AND [zoning] LIKE '%' + @zoning + '%' 
       AND [environmental] LIKE '%' + @environmental + '%' 
       AND [emg_projectnumber] LIKE '%' + @emg_projectnumber + '%' 
       AND [zoning_projectnumber] LIKE '%' + @zoning_projectnumber + '%' 
       AND [surveyor_projectnumber] LIKE '%' + @surveyor_projectnumber + '%' "

在构建CommandText变量时,在asp代码中执行一些条件逻辑。例如,如果在ProjectName文本框中未输入任何内容,则不要将其包括在查询中。此外,您可以考虑使用或逻辑代替。这将取决于你想要达到的目标

这里有一个大概的方法。这不是真正的代码,它只是显示了方法:

string WhereClause = "where 1 = 2 "
if a project name was specified.
WhereClause = WhereClause + something about the project name.
etc

另外,请记住包含查询参数。

关于这一点,请在临时表中添加所有内容,删除所有需要的内容,然后从临时表返回

SELECT [surveyid], [projectnumber], [siteno], [person], [subatpdate], [projectname], 
[priorsurveyor], [siteaddress], [sitecity], [sitestate], [sitezip], [survey], [zoning], 
[environmental], [emg_projectnumber], [zoning_projectnumber], [surveyor_projectnumber] 
INTO #temp
FROM tblRawProjectDatabase
 WHERE ([projectnumber] LIKE '%' + @projectnumber + '%' OR [projectnumber] IS NULL) AND 
([siteno] LIKE '%' + @siteno + '%' OR [siteno] IS NULL) AND 
([person] LIKE '%' + @person + '%' OR [person] IS NULL) AND 
([priorsurveyor] LIKE '%' + @priorsurveyor + '%' OR [priorsurveyor] IS NULL) AND 
([siteaddress] LIKE '%' + @siteaddress + '%' OR [siteaddress] IS NULL) AND 
([sitecity] LIKE '%' + @sitecity + '%' OR [sitecity] IS NULL) AND 
([sitestate] LIKE '%' + @sitestate + '%' OR [sitestate] IS NULL) AND 
([sitezip] LIKE '%' + @sitezip + '%' OR [sitezip] IS NULL) AND 
([survey] LIKE '%' + @survey + '%' OR [survey] IS NULL) AND 
([zoning] LIKE '%' + @zoning + '%' OR [zoning] IS NULL) AND 
([environmental] LIKE '%' + @environmental + '%' OR [environmental] IS NULL) AND 
([emg_projectnumber] LIKE '%' + @emg_projectnumber + '%' OR [emg_projectnumber] IS NULL) AND 
([zoning_projectnumber] LIKE '%' + @zoning_projectnumber + '%' OR [zoning_projectnumber] IS NULL) AND 
([surveyor_projectnumber] LIKE '%' + @surveyor_projectnumber + '%' OR [surveyor_projectnumber] IS NULL)

DELETE FROM #temp WHERE ProjectManaer IS NULL
SELECT * FROM #temp
DROP TABLE #temp

顺便说一句,你把SQL放在一起的方式让自己很容易受到SQL注入的影响。为了获得免费搜索功能,我会使用Lucene这样的平台,而不是直接搜索数据库。ErikE,在这一点上,功能将是一个美丽的景象,但我会注意到这一点。是什么让它变得脆弱?我有PHP和MySql的背景,所以这些东西的设置方式仍然让我感到困惑。戴,我在DotNetNuke中使用XMod模块。不幸的是,在数据库交互模块中,搜索数据库并不是他们认为必要的功能,所以我正在尝试解决它。我尝试了多种变体,或者似乎总是让它返回不需要的结果。我想到了使用ASP代码来创建查询,但我希望在没有代码的情况下有一些方法来实现这一点,因为查询是在XMOD for DotNetNuke中执行的。我知道该模块有自己的小脚本标记,所以我将看看这是否是一种更好的方法。它使用参数,我只是没有复制和粘贴这些参数。在应用程序代码中可以执行的大多数逻辑也可以在tsql中执行。当然,您必须使用动态sql。感谢您的回复。我想我不太明白你的意思。这个临时桌有什么好处?可悲的是,如果只是存在短路或操作员,我的当前设置就不会有任何问题。
SELECT [surveyid], [projectnumber], [siteno], [person], [subatpdate], [projectname], 
[priorsurveyor], [siteaddress], [sitecity], [sitestate], [sitezip], [survey], [zoning], 
[environmental], [emg_projectnumber], [zoning_projectnumber], [surveyor_projectnumber] 
INTO #temp
FROM tblRawProjectDatabase
 WHERE ([projectnumber] LIKE '%' + @projectnumber + '%' OR [projectnumber] IS NULL) AND 
([siteno] LIKE '%' + @siteno + '%' OR [siteno] IS NULL) AND 
([person] LIKE '%' + @person + '%' OR [person] IS NULL) AND 
([priorsurveyor] LIKE '%' + @priorsurveyor + '%' OR [priorsurveyor] IS NULL) AND 
([siteaddress] LIKE '%' + @siteaddress + '%' OR [siteaddress] IS NULL) AND 
([sitecity] LIKE '%' + @sitecity + '%' OR [sitecity] IS NULL) AND 
([sitestate] LIKE '%' + @sitestate + '%' OR [sitestate] IS NULL) AND 
([sitezip] LIKE '%' + @sitezip + '%' OR [sitezip] IS NULL) AND 
([survey] LIKE '%' + @survey + '%' OR [survey] IS NULL) AND 
([zoning] LIKE '%' + @zoning + '%' OR [zoning] IS NULL) AND 
([environmental] LIKE '%' + @environmental + '%' OR [environmental] IS NULL) AND 
([emg_projectnumber] LIKE '%' + @emg_projectnumber + '%' OR [emg_projectnumber] IS NULL) AND 
([zoning_projectnumber] LIKE '%' + @zoning_projectnumber + '%' OR [zoning_projectnumber] IS NULL) AND 
([surveyor_projectnumber] LIKE '%' + @surveyor_projectnumber + '%' OR [surveyor_projectnumber] IS NULL)

DELETE FROM #temp WHERE ProjectManaer IS NULL
SELECT * FROM #temp
DROP TABLE #temp